机器学习-集成学习
机器学习-集成学习
机器学习-集成学习
新手小白逆袭大神之路
目录
1.集成学习
学习器就是模型,多个模型共同预测,采用多数投票法,虽然都是弱分类器,但每个分类器预测一部分,多数会正确。
集成学习是一种思想,是把多个模型集成一个模型。
集成学习有以上3种思想
2.为什么需要集成学习
通过不同的三个模型,训练三个数据集.第一个模型有几个预测错了,但是其它模型预测对了。其它模型预测错了,但其它俩是对的。所以,可以采用投票的方式。如果大多数是对的,那就是对的。
但是三个模型的权重可能不一样。第一个是0.5,第二个0.4,第三0.1。把多个模型综合一个模型。从而提高效果。
为什么需要集成学习呢?需要弱分类器》0.5,那么就能保证大部分预测正确,通过多个不同类型模型器,达到一个综合效果,最后得到一个比较好的效果。
1.集成学习本身就是一种思想。就像决策树,通过随机构建,能提高模型的效果。不同分类器可能会导致不同分类边界,对同一样本,那么通过整合多个模型,就能得到更加合理的边界,减少整体错误率,实现更好效果。
2.当训练的数据集过大时,对数据集进行划分成很多块,每块都训练成一个分类器,最终合并成一个大分类器;通过大分类器来验证数据。对于过小数据集,采用重复抽样,假如有1000条数据,那么抽1000条,但是数据中有可能重复。这样重复抽三次。有三个样本集。然后训练三个模型。第一个模型可能偏向重复数据,第二个模型偏向重复数据,第三个模型偏向重复数据。这样三个重复数据能盖全全部数据,从而提高预测效果。
3.可能数据边界过于复杂,用一个模型不好训练。所以可以用多个模型来训练,达到一个综合效果。
4.对企业中不同存储系统的数据格式数据,我们可以为每一种数据格式创建一个模型,然后,综合一个大模型,从而提高效果。
3.Bagging算法
Bagging的思想是在原始数据集上做有放回抽样,然后,抽回s个数据集,然后训练s个分类器。把多个分类器合成 一个分类器。是bagging.
采用多个模型投票方式来决定分类。或均值方式回归。
Bagging用以前学过的算法,来作为弱学习器。Bagging只负责把多个学习器合并成一个学习器,是哪种学习器不考虑。Svm是强学习器。
注意:bagging方式要求每个子集的样本数量和原始样本数量一样。如原始有1000个样本,那么抽取也要有1000个样本。所以样本有可能重复。每个数据集会训练一个模型,然后把多个模型按加权融合一个大分类器。
训练出的多个学习器按照某个结合策略(多数投票或者多个学习输出做均值)合成一个强学习器,得到最终预测结果。
4.随机森林
Bagging一种实现叫随机森林.
- 从样本中有放回抽样.
- 从所有属性里随机选择一部分属性,然后计算最佳分割属性,创建决策树。只所以没有选最优的是因为是缺陷的。如果是最优也只能在本训练集上最优,当在测试的时候会不好,如果是随机的话,会创建多个模型,如果一个第一个模型不好,其它模型好。从而提高效果。
- 每次随机选一部分,这样多选几次,会产生多个模型。那么m个决策树就是随机森林。然后通过投表来决定是哪一种。
大家可能会担心,一个样本,会分别属于1,2,3那么说明这个样本有问题。所以一般情况,一样样本肯定能预测出类型的。即使有特殊的,也可以通过概率来解决。因每个节点都有样本数。可能过样本数来计算概率,选择概率最大的,而随机森林就是通过加权实现的。
决策树再选取特征时,是根据最优选的。而随机森林呢是根据随机抽取几个找最优的时行 分裂。随机森林不存过拟合的情况。因为采用局部最优,不会造成训练特别契合,测试集不好的情况。
过拟合的表现:
决策树最优是通过当前数据集计算的最优,所以有可能产生过拟合。
所以随机森林,通过多个数据集合来训练增加效果。
5.随机森林实例
1)代码展示
#coding=UTF-8
import numpy as np
import pandas as pd
defaultencoding = 'utf-8'
import matplotlib as mpl
import matplotlib.pyplot as plt
import sys
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
# 年龄,性伴侣数量,第一次性交(年龄),怀孕次数,抽烟,抽烟(年),抽烟(包/年),荷尔蒙避孕药,荷尔蒙避孕药(年),IUD,IUD(年),性病,性病(数量)/性病:尖锐湿疣
# 性病:宫颈湿疣,性病:阴道尖锐湿疣,性病:外阴 - 会阴性湿疣,性病:梅毒,性病:盆腔炎,性病:生殖器疱疹,性病:传染性软疣,性病:艾滋病,性病:HIV
# 性病:乙型肝炎,性病:HPV,性病:诊断次数,性病:自首次诊断以来的时间,性病:自去年以来的时间诊断,Dx:癌症,Dx:CIN,Dx:HPV,Dx
# Hinselmann:目标变量,席勒:目标变量,细胞学:目标变量,活组织检查:目标变量
names = [u'Age', u'Number of sexual partners', u'First sexual intercourse',
u'Num of pregnancies', u'Smokes', u'Smokes (years)',
u'Smokes (packs/year)', u'Hormonal Contraceptives',
u'Hormonal Contraceptives (years)', u'IUD', u'IUD (years)', u'STDs',
u'STDs (number)', u'STDs:condylomatosis',
u'STDs:cervical condylomatosis', u'STDs:vaginal condylomatosis',
u'STDs:vulvo-perineal condylomatosis', u'STDs:syphilis',
u'STDs:pelvic inflammatory disease', u'STDs:genital herpes',
u'STDs:molluscum contagiosum', u'STDs:AIDS', u'STDs:HIV',
u'STDs:Hepatitis B', u'STDs:HPV', u'STDs: Number of diagnosis',
u'STDs: Time since first diagnosis', u'STDs: Time since last diagnosis',
u'Dx:Cancer', u'Dx:CIN', u'Dx:HPV', u'Dx', u'Hinselmann', u'Schiller',
u'Citology', u'Biopsy']#df.columns
#宫颈癌预测
datas=pd.read_csv("data/risk_factors_cervical_cancer.csv")
datas=datas.replace("?",np.NaN)#缺失处理
datas=datas.dropna(axis=1)
X=datas.iloc[:,0:-4]
Y=datas.iloc[:,-4:]
from sklearn.impute import SimpleImputer
# 使用Imputer给定缺省值,默认的是以mean
# 对于缺省值,进行数据填充;默认是以列/特征的均值填充
# imputer=SimpleImputer(missing_values="NaN")#给NaN属性赋值为列均值
# X=imputer.fit_transform(X,Y)#对缺失值进行处理
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import label_binarize
# n_estimators=40 创建40个模型
randomForest=RandomForestClassifier(n_estimators=40,criterion="gini",min_samples_split=2,random_state=2)
train_x,test_x,train_y,test_y=train_test_split(X,Y,test_size=0.3,random_state=2)
randomForest.fit(train_x,train_y)#用来创建40个决策树模型
test_y_hat=randomForest.predict(test_x)#预测
import sklearn.metrics as metrics
proba=randomForest.predict_proba(test_x)
print(proba)
# label 0 1会在一列 多添加一列
lbl1=label_binarize(test_y["Hinselmann"],classes=(0,1,2))[:,0:-1]
lbl2=label_binarize(test_y["Schiller"],classes=(0,1,2))[:,0:-1]
lbl3=label_binarize(test_y["Citology"],classes=(0,1,2))[:,0:-1]
lbl4=label_binarize(test_y["Biopsy"],classes=(0,1,2))[:,0:-1]
fpr1,tpr1,threofor1=metrics.roc_curve(lbl1.ravel(),proba[0].ravel())
fpr2,tpr2,threofor2=metrics.roc_curve(lbl2.ravel(),proba[1].ravel())
fpr3,tpr3,threofor3=metrics.roc_curve(lbl3.ravel(),proba[2].ravel())
fpr4,tpr4,threofor4=metrics.roc_curve(lbl4.ravel(),proba[3].ravel())
plt.figure()
plt.plot(fpr1,tpr1,c="red",label="Hinselmann"+str(metrics.auc(fpr1,tpr1)))
plt.plot(fpr2,tpr2,c="green",label="Schiller"+str(metrics.auc(fpr2,tpr2)))
plt.plot(fpr3,tpr3,c="black",label="Citology"+str(metrics.auc(fpr3,tpr3)))
plt.plot(fpr4,tpr4,c="gray",label="Biopsy"+str(metrics.auc(fpr4,tpr4)))
plt.legend()
plt.show()
2)运行结果
6.Boosting算法
1)AdaBoost算法
①实例
②代码展示
#coding=UTF-8
import sys
import matplotlib as mpl
import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
defaultencoding = 'utf-8'
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
from sklearn.datasets import make_gaussian_quantiles
# 调用sklearn提供的方法生成200个样本 两列 两个种类
X1,Y1=make_gaussian_quantiles(cov=1,n_samples=200,n_features=2,n_classes=2,random_state=5)
# print Y1
# X2,Y2=make_gaussian_quantiles(mean=(3,3),cov=1.5,n_samples=200,n_features=2,n_classes=2)
# X1=np.concatenate((X1,X2))
# Y1=np.concatenate((Y1,-Y2+1))
#n_estimators=50生成50个模型 模型权重计算方法
ada=AdaBoostClassifier(DecisionTreeClassifier(max_depth=100),n_estimators=50,algorithm="SAMME.R",random_state=1)#深度少,学习器就要多,才能达到好效果
#数据量大的时候,可以增加内部分类器的树深度,也可以不限制树深
#max_depth树深,数据量大的时候,一般范围在10——100之间
#数据量小的时候,一般可以设置树深度较小,或者n_estimators较小
#n_estimators 迭代次数或者最大弱分类器数:200次
#base_estimator:DecisionTreeClassifier 选择弱分类器,默认为CART树
#algorithm:SAMME 和SAMME.R 。SAMME模型效果来算权重,每个模型权重运算规则,后者是优化算法,以概率调整权重收敛快,
#需要能计算概率的分类器支持
#loss:linear、‘square’exponential’。误差计算公式:一般用linear足够的,第k个弱分类器中第i个样本的误差的处理
ada.fit(X1,Y1)
# 生成背景
print(X1[:,0].min())
x1min=np.min(X1[:,0].min())
x1max=np.max(X1[:,0].max()+1)
x2min=np.min(X1[:,1].min())
x2max=np.max(X1[:,1].max()+1)
x1,x2=np.meshgrid(np.arange(x1min,x1max,0.02),np.arange(x2min,x2max,0.02))
ypredict=ada.predict(np.c_[x1.ravel(),x2.ravel()])
plt.figure()
plt.subplot(121)
print(x1.shape)
plt.pcolormesh(x1,x2,ypredict.reshape(x1.shape),cmap=plt.cm.Paired)
print (zip(range(0,2),'rb','AB'))
for i,c,k in zip(range(0,2),'rb','AB'):
id=np.where(Y1==i)#获取索引
plt.scatter(X1[id,0],X1[id,1],c=c,label=k, cmap=plt.cm.Paired)
plt.legend()
plt.show()
③运行结果
2)GBDT 算法
GBDT用的是残差作为下个模型的Y值
①实例
②代码展示
#coding=UTF-8
import sys
import matplotlib as mpl
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor,GradientBoostingClassifier
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
defaultencoding = 'utf-8'
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
import pandas as pd
datas=pd.read_csv("data/household_power_consumption_1000.txt",sep=";")
X=datas.iloc[:,2:4]
Y=datas.iloc[:,5]
# poly=PolynomialFeatures(degree=6)
# X=poly.fit_transform(X)
line=LinearRegression()
gbdt=GradientBoostingRegressor(learning_rate=0.1,n_estimators=100,min_samples_split=3,max_depth=3)
train_x,test_x,train_y,test_y=train_test_split(X,Y,test_size=0.2,random_state=1)
# aa=pd.DataFrame(train_x)
# print(type(aa))
line.fit(train_x,train_y)#求theata向量
gbdt.fit(train_x,train_y)#建立树模型
line_y_hat=line.predict(test_x)
gbdt_y_hat=gbdt.predict(test_x)
x=len(test_x)
plt.plot(np.arange(x),line_y_hat,color="red",label="线性回归"+str(line.score(test_x,test_y)))
plt.plot(np.arange(x),gbdt_y_hat,color="green",label="梯度提升"+str(gbdt.score(test_x,test_y))+" "+str(gbdt.score(train_x,train_y)))
plt.plot(np.arange(x),test_y,label="原始数据",color="black");
plt.legend()
plt.show()
③运行效果
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)