集成算法
投票法
1.少数服从多数
2.多模型一致(硬投票)
3.更高把握(置信度)原则,以最高执行度的模型预测结果为准
4.把握程度汇总进行投票(软投票)
基于多个优化模型的投票分类器sklearn.ensemble.VotingClassifier
from sklearn.ensemble import VotingClassifier # 导入投票分类器
from sklearn.datasets import load_iris # 导入训练数据集
iris=load_iris()
构建若干基础模型
# 构建若干基础模型
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
clf1=LogisticRegression()
clf2=GaussianNB()
clf3=SVC(kernel='rbf')
建立投票分类器(hard)
#实例化
vote_clf=VotingClassifier(estimators=[('lr',clf1),('GNB',clf2),('SVM',clf3)],voting='hard')
# 训练投票分类器
vote_clf.fit(iris.data,iris.target)
# 预测
vote_clf.predict(iris.data)
### 建立投票分类器(soft)
建立投票分类器(soft)
clf1=LogisticRegression()
clf2=GaussianNB()
clf3=SVC(kernel=‘rbf’,probability=True)
vote_clf2=VotingClassifier(estimators=[(‘lr’,clf1),(‘GNB’,clf2),(‘SVM’,clf3)],voting=‘soft’) #实例化
vote_clf2=vote_clf2.fit(iris.data,iris.target)# 训练
vote_clf2.predict(iris.data)# 预测
预测输出概率值
vote_clf2.predict_proba(iris.data)
array([[9.86641908e-01, 1.06874777e-02, 2.67061395e-03],
[9.80580511e-01, 1.64122717e-02, 3.00721706e-03],
[9.88225368e-01, 9.17685191e-03, 2.59777978e-03],
[9.81921847e-01, 1.49389403e-02, 3.13921237e-03],
。。。。。。。
例如,第一行,0.9866最大,所以为第一类
硬投票不能查看概率值
投票分类器与网格搜索的联合使用
from sklearn.model_selection import GridSearchCV # 导入网格搜索
from sklearn.ensemble import VotingClassifier# 导入投票分类器
构建若干基础模型
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
clf1=LogisticRegression()
clf2=GaussianNB()
clf3=SVC(probability=True)
#probability默认为false ,所以设置为true ,方便后续查看概率值
probability默认为false ,所以设置为true ,方便后续查看概率值
#实例化
vote_clf2=VotingClassifier(estimators=[('lr',clf1),('GNB',clf2),('SVM',clf3)],voting='soft')
# 设置参数搜索范围
params={'lr__C':[0.1,1,10],
'SVM__C':[0.01,0.1,1,10],
'SVM_kernel':['linear','rbf']}
注意:SVM__C,lr__C’这里是两个横线,小心报错
params={‘lr__C’:[0.1,1,10],‘SVM__C’:[0.01,0.1,1,10], ‘SVM_kernel’:[‘linear’,‘rbf’]}一共会搜索 24次:342
#在网格搜索中直接调用投票分类器
grid=GridSearchCV(estimator=vote_clf,param_grid=params,cv=8)
estimator:给出分类器类别
param_grim:需要将参数名称设定为“模型标签——参数标签”格式
from sklearn.datasets import load_iris
iris=load_iris()
grid=grid.fit(iris.data,iris.target)# 训练网格搜索模型grid
print(grid.get_params())#打印网格搜索出的最优参数值
print(grid.get_params())# 查看所有参数
#查看网格搜索结果
import pandas as pd
pd.DataFrame(grid.cv_results_)
print(grid.best_estimator_)
print(grid.get_params()) #查看grid模型所以的参数值
grid.predict_proba(iris.data)#利用网格搜索模型进行预测
grid.predict(iris.data)
Bagging
bagging 是booststrap有放回抽样
from sklearn.datasets import load_iris
from sklearn.ensemble import BaggingClassifier
#,max_features=0.5
iris=load_iris()
bagging=BaggingClassifier(n_estimators=20,max_samples=0.5,oob_score=True)
bagging.fit(iris.data,iris.target)
# 每个分类器抽取的样本号
bagging.estimators_samples_
# 每个分类器抽取的特征
bagging.estimators_features_
# 查看每个分类器
bagging.estimators_
# 每个基本分类器都可以被单独使用
tree1=bagging.estimators_[0].fit(iris.data,iris.target)
tree1.predict(iris.data)
# 查看袋外oob测试结果
bagging.oob_score_
# 估计各数据点属于每个类别的决定函数值(取几个值中最大的)
bagging.oob_decision_function_
# 集成模型用于预测
bagging.predict(iris.data)
回归BaggingRegressor
# 导入波士顿房价数据集
from sklearn.datasets import load_boston
boston=load_boston()
#导入bagging回归
from sklearn.ensemble import BaggingRegressor
bagging=BaggingRegressor()
from sklearn.linear_model import LinearRegression
#实例化
bagging_reg=BaggingRegressor(LinearRegression(),n_estimators=20,max_samples=0.5,max_features=0.5,oob_score=True)
bagging_reg.fit(boston.data,boston.target)
bagging_reg.oob_score_
print(len(bagging_reg.oob_prediction_),bagging_reg.oob_prediction_)# 样本数量,预测值
bagging_reg.predict(boston.data)# 集成模型用于预测
随机森林分类
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
iris=load_iris()
rfc=RandomForestClassifier(n_estimators=300,oob_score=True)
rfc.fit(iris.data,iris.target)
rfc.estimators_#基分类器
rfc.estimators_[0].predict(iris.data)# 利用第一个基分类器进行预测
rfc.estimators_[0].feature_importances_# 由第一个分类器计算的特征重要性
#可以看见第一个基分类器的结果与随机森铃的结果类似,都是前两个小,后两个大
rfc.feature_importances_# 查看由随机森铃模型计算的特征重要性,可以用来降维,因为前面两个值特别小
rfc.oob_score_# 袋外oob测试结果
rfc.predict(iris.data)
rfc.oob_decision_function_# 查随机森林模型对各数据点的决定函数值
AdaBoostClassifier
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
boston=load_iris()
adac=AdaBoostClassifier()
adac.fit(boston.data,boston.target)
adac.estimators_
adac.estimator_errors_# 估计误差,可以看出误差是逐渐递减的
adac.classes_# 样本标签
adac.n_classes_# 查看数据类别数
adac.estimator_weights_# 查看模型权重
adac.feature_importances_
adac.predict(iris.data)
for item in adac.staged_predict_proba(iris.data):#输出adaboost每一次迭代对数据点的预测概率值
print(item)
gbdt
gbdt全称梯度下降树
gbdt 是通过采用加法模型(即基函数的线性组合),以及不断减小训练过程产生的残差来达到将数据分类或者回归的算法。
gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。
# 导入模块
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.datasets import load_iris
iris=load_iris()
gbc=GradientBoostingClassifier()
gbc.fit(iris.data,iris.target)
gbc.predict(iris.data)
gbc.predict_proba(iris.data)
#输出每次迭代的预测概率值
for item in gbc.staged_predict_proba(iris.data[:5]):
print(item)
# 查看每次迭代在训练集上的分数
print(len(gbc.train_score_),gbc.train_score_)
import matplotlib.pyplot as plt
plt.plot(gbc.train_score_)# 训练曲线
gbc.decision_function(iris.data)# 输出各数据点的决定函数值
gbc.feature_importances_# 特征重要性:可见后两个特征比较重要,可以进行取舍,达到降维的目的
gbc.estimators_#查看基模型