1、集成学习
前几篇写了常见的几个机器学习算法,用这些算法训练出的模型各有优劣。而在实际的工程中,目标一定是贪心的,想要的更多地是万无一失。不难想到,把所有的模型集成在一起,做一个强大的、拥有更多优势的模型,以“饱和式救援”的思路来保证万无一失,这便是集成学习的原理。
当把模型集成到一个大的模型中时,最终的结果听谁的又成了一个问题,一般会有两种解决方案:硬投票-hard_voting和软投票-soft_voting。硬投票,就是少数服从多数。软投票,就是综合了各个算法预测标签的概率,基于概率平均的投票,所以软投票的前置条件是集成的每个算法都能估计概率。
硬投票-hard_voting 软投票-soft_voting从投票的角度来看,集成的模型越多越好,但机器学习的算法训练出的模型还是远远不够的。那么既然算法的类别只有这几类,训练出各个算法的不同子模型就是增加模型个数的一种解决方案。训练出不同子模型,重点就是模型的差异性,如何创建差异性呢?
这种差异性是通过每个子模型只看样本数据的一部分实现的。对于取数据,取样方式分为放回取样Bagging和不放回取样Pasting,更常用的是Bagging方式,统计学中叫bootstrap。对于每个子模型来讲,因为看的样本数据减少了,那么准确率肯定会降低。但从整体的效果而言,子模型的准确并不需要太高的准确率,如果单个子模型的准确率是51%的话,500个子模型最终效果可以达到65.6%;如果单个子模型的准确率是60%的话,500个子模型最终效果就可以达到99.999%。
采用bobo老师创建简单测试用例
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 创建测试数据
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
plt.show1
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 创建训练和测试数据
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、随机森林
随机森林,就是一种集成学习。它的子模型是一棵一棵的决策树,决策树作为一种非参数学习算法,使用它创建子模型更能产生差异性。
采用bobo老师创建简单测试用例
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
网友评论