1、集成學(xué)習(xí)
前幾篇寫了常見的幾個(gè)機(jī)器學(xué)習(xí)算法,用這些算法訓(xùn)練出的模型各有優(yōu)劣。而在實(shí)際的工程中,目標(biāo)一定是貪心的,想要的更多地是萬無一失。不難想到,把所有的模型集成在一起,做一個(gè)強(qiáng)大的、擁有更多優(yōu)勢的模型,以“飽和式救援”的思路來保證萬無一失,這便是集成學(xué)習(xí)的原理。
當(dāng)把模型集成到一個(gè)大的模型中時(shí),最終的結(jié)果聽誰的又成了一個(gè)問題,一般會有兩種解決方案:硬投票-hard_voting和軟投票-soft_voting。硬投票,就是少數(shù)服從多數(shù)。軟投票,就是綜合了各個(gè)算法預(yù)測標(biāo)簽的概率,基于概率平均的投票,所以軟投票的前置條件是集成的每個(gè)算法都能估計(jì)概率。


從投票的角度來看,集成的模型越多越好,但機(jī)器學(xué)習(xí)的算法訓(xùn)練出的模型還是遠(yuǎn)遠(yuǎn)不夠的。那么既然算法的類別只有這幾類,訓(xùn)練出各個(gè)算法的不同子模型就是增加模型個(gè)數(shù)的一種解決方案。訓(xùn)練出不同子模型,重點(diǎn)就是模型的差異性,如何創(chuàng)建差異性呢?
這種差異性是通過每個(gè)子模型只看樣本數(shù)據(jù)的一部分實(shí)現(xiàn)的。對于取數(shù)據(jù),取樣方式分為放回取樣Bagging和不放回取樣Pasting,更常用的是Bagging方式,統(tǒng)計(jì)學(xué)中叫bootstrap。對于每個(gè)子模型來講,因?yàn)榭吹臉颖緮?shù)據(jù)減少了,那么準(zhǔn)確率肯定會降低。但從整體的效果而言,子模型的準(zhǔn)確并不需要太高的準(zhǔn)確率,如果單個(gè)子模型的準(zhǔn)確率是51%的話,500個(gè)子模型最終效果可以達(dá)到65.6%;如果單個(gè)子模型的準(zhǔn)確率是60%的話,500個(gè)子模型最終效果就可以達(dá)到99.999%。
采用bobo老師創(chuàng)建簡單測試用例
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 創(chuàng)建測試數(shù)據(jù)
X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show() # 見plt.show1

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 創(chuàng)建訓(xùn)練和測試數(shù)據(jù)
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
# 使用 Hard Voting Classifier
voting_clf = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('svm_clf', SVC()),
('dt_clf', DecisionTreeClassifier(random_state=666))],voting='hard')
voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test)
# 0.89600000000000002
# 使用 Soft Voting Classifier
voting_clf2 = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('svm_clf', SVC(probability=True)),#probability=True,概率
('dt_clf', DecisionTreeClassifier(random_state=666))],
voting='soft')
voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)
# 0.91200000000000003
2、隨機(jī)森林
隨機(jī)森林,就是一種集成學(xué)習(xí)。它的子模型是一棵一棵的決策樹,決策樹作為一種非參數(shù)學(xué)習(xí)算法,使用它創(chuàng)建子模型更能產(chǎn)生差異性。
采用bobo老師創(chuàng)建簡單測試用例
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=500, oob_score=True, random_state=666, n_jobs=-1)
rf_clf.fit(X, y)
rf_clf.oob_score_
# 0.89200000000000002
rf_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, oob_score=True, random_state=666, n_jobs=-1)
rf_clf2.fit(X, y)
rf_clf2.oob_score_
# 0.90600000000000003