只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的
分类圆形和长方形
在机器学习中,随机森林是⼀个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数⽽定。随机森林 = 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()
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务