目录

集成学习通过建⽴⼏个模型来解决单⼀预测问题。它的⼯作原理是⽣成多个分类器/模型,各⾃独⽴地学习和作出预 测。这些预测最后结合成组合预测,因此优于任何⼀个单分类的做出预测。
只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的
分类圆形和长方形

在机器学习中,随机森林是⼀个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数⽽定。随机森林 = Bagging + 决策树
列如: 如果你训练了5个树, 其中有4个树的结果是True, 1个树的结果是False, 那么最终投票结果就是True
1、随机森林够造过程中的关键步骤(M表示特征数⽬):
1)⼀次随机选出⼀个样本,有放回的抽样,重复N次(有可能出现重复的样本)
2) 随机去选出m个特征, m <M
如果不进⾏随机抽样,每棵树的训练集都⼀样,那么最终训练出的树分类结果也是完全⼀样的
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“⽚⾯的”(当然这样说可能不对),也就是说每棵树训练出来都是有很⼤的差异的;⽽随机森 林最后分类取决于多棵树(弱分类器)的投票表决。
2.包外估计
在随机森林构造过程中,如果进⾏有放回的抽样,我们会发现,总是有⼀部分样本我们选不到。
由于基分类器是构建在训练样本的⾃助抽样集上的,只有约 63.2% 原样本集出现在中,⽽剩余的 36.8% 的数据作为包 外数据,可以⽤于基分类器的验证集。
3.bagging集成优点
Bagging + 决策树/线性回归/逻辑回归/深度学习… = bagging集成学习⽅法
经过上⾯⽅式组成的集成学习⽅法:
1. 均可在原有算法上提⾼约2%左右的泛化正确率
2. 简单, ⽅便, 通⽤
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import seaborn as sns
- from imblearn.under_sampling import RandomUnderSampler
- from sklearn.preprocessing import LabelEncoder
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.metrics import log_loss
- from sklearn.preprocessing import OneHotEncoder
-
- data = pd.read_csv("F:\\数学建模\\机器学习\\数据\\train.csv")
- # print(data)
- # print(data.describe())
- # print(data.shape)
-
- # sns.countplot(data.target)
- # plt.show() #该数据类别不均衡
-
- #数据基本处理(数据已经经过脱敏,不在需要特殊处理)
- # new1_data=data[:10000] #取前一万行
- # print(new1_data)
- #使用上述方法不可行,使用随机欠采样获取响应数据
- y=data["target"]
- x=data.drop(["id","target"],axis=1)
- rus=RandomUnderSampler(random_state=0)
- x_sample,y_sample=rus.fit_resample(x,y)
- print(x_sample)
- print(y_sample)
- sns.countplot(y_sample) #样本均衡了
- plt.show()
-
- #将目标值的属性转化为数字
- le=LabelEncoder()
- y_sample=le.fit_transform(y_sample)
- print(y_sample)
-
- #分割数据
- x_train,x_test,y_train,y_test = train_test_split(x_sample,y_sample,random_state=22,test_size=0.2) #测试集合训练集每类样本不均衡的问题
- rf=RandomForestClassifier(oob_score=True) #包外估计
- rf.fit(x_train,y_train)
- y_pre=rf.predict(x_test)
- print(y_pre)
- # print(rf.score(x_test,y_test))
- # print(rf.oob_score_)
-
- #使用logloss模型评估
- # log_loss(y_test,y_pre,eps=1e-15,normalize=True)
- #log_loss使用中y_test,y_pre需要用one—hot表示
- one_hot=OneHotEncoder(sparse=False)
- y_test1=one_hot.fit_transform(y_test.reshape(-1,1))
- y_pre1=one_hot.fit_transform(y_pre.reshape(-1,1))
- print(y_test1)
- print(y_pre1)
- print(log_loss(y_test1,y_pre1,eps=1e-15,normalize=True))
- #改变预测值的输出模式,让输出结果为百分比,降低logloss
- y_pre_proba=rf.predict_proba(x_test)
- print(y_pre_proba)
- print(log_loss(y_test1,y_pre_proba,eps=1e-15,normalize=True))
-
- #参数调优(n_estimators=one_parameter,
- # max_depth=10,max_features=10,min_samples_leaf=10) 通过正确率和损失图来一个一个确定
-
-
- tuned_parameters=range(10,200,10)
- accuracy_t=np.zeros(len(tuned_parameters))
- error_t=np.zeros(len(tuned_parameters))
- # print(accuracy_t) [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
- for j,one_parameter in enumerate(tuned_parameters):
- rf2=RandomForestClassifier(n_estimators=one_parameter,
- max_depth=10,max_features=10,min_samples_leaf=10,oob_score=True,random_state=0,n_jobs=-1)
- rf2.fit(x_train,y_train)
- accuracy_t[j]=rf2.oob_score_ #输出精确度
- y_pre=rf2.predict_proba(x_test)
- error_t[j]=log_loss(y_test,y_pre,eps=1e-15,normalize=True)
- # print(error_t)
- plt.plot(tuned_parameters,accuracy_t)
- plt.xlabel("n_estimators")
- plt.ylabel("accuracy")
- plt.grid(True)
- plt.show()