装袋算法是一种提高分类准确度的算法,通过给定组合投票的方式获得最优解。比如你生病了去不同医院看了几个医生,每个医生都给你开了药方,最后哪个药方的出现次数多 ,就说明这个药方越有可能是最优解,这就是装袋算法的思想。
主要的三种装袋算法模型:
装袋决策树(Bagged Decision Trees)
随机森林(Random Forest)
极端随机树(Extra Trees)
以最常见的装袋决策树为例,sklearn中实现装袋决策树算法的类是 BaggingClassifie。
#装袋决策树算法-波士顿数据集
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
#导入数据
filename = 'data/boston_housing.csv'
names= ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename , names=names)
data=data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) #一定要清洗数据,否则数据中含有NAN就会报错
#将数据分为输入数据和输出结果
array = data.values
X = array [:,0:13]
Y = array [:,13]
Y = Y.astype(int).astype(float)#波士顿房价数据集的标签是浮点型的,但是计算中的方法要求整形的,所以会报错Unknown label type:‘continuous‘,网上看到这个解决办法,还没明白原理
num_folds = 10
seed = 11
kfold = KFold(n_splits=num_folds, random_state=seed,shuffle=True)
cart = DecisionTreeClassifier()
num_tree = 100
model = BaggingClassifier (base_estimator=cart, n_estimators=num_tree,random_state=seed)
model.fit(X,Y)
result= cross_val_score(model,X,Y,cv=kfold)
print(result.mean())
print(model.predict([data.values[5][:13]]))
打印结果如下
PS C:\coding\machinelearning> & C:/Users/admin/anaconda3/envs/pytorch/python.exe c:/coding/machinelearning/装袋决策树Boston.py
0.15043478260869564
[28.]
PS C:\coding\machinelearning>
顾名思义,随机森林是用随机的方式建立一个森林,森林由很多的决策树组成, 且每一棵决策树之间是没有关联的。得到森林之后,当有一个新的输入样本进入的时候, 就让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类,再看看哪一类被选择最多,就预测这个样本为哪一类。
sklearn 中实现随机森林算法的类是 RandomForestClassifier类
#随机森林算法-波士顿数据集
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
#导入数据
filename = 'data/boston_housing.csv'
names= ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename , names=names)
data=data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) #一定要清洗数据,否则数据中含有NAN就会报错
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
Y = Y.astype(int).astype(float)#波士顿房价数据集的标签是浮点型的,但是计算中的方法要求整形的,所以会报错Unknown label type:‘continuous‘,网上看到这个解决办法,还没明白原理
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed,shuffle=True)
num_tree = 100
max_features = 3
model = RandomForestClassifier (n_estimators=num_tree , random_state=seed,
max_features=max_features)
result= cross_val_score(model , X, Y, cv=kfold)
print(result.mean())
#预测单个数据
model.fit(X,Y)
print(model.predict([data.values[5][:13]]))
打印结果如下:
PS C:\coding\machinelearning> & C:/Users/admin/anaconda3/envs/pytorch/python.exe c:/coding/machinelearning/随机森林Boston.py
0.13942028985507246
[28.]
PS C:\coding\machinelearning>
极端随机树是由 PierreGeurts 等人于2006 年提出的,它与随机森林十分相似,都是由许多决策树构成。 但它与随机森林有两个主要的区别:
( 1 )随机森林应用的是 Bagging 模型,而极端随机树是使用所有的训练样本得到每 棵决策树,也就是每棵决策树应用的是相同的全部训练样本
( 2 )随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉的。
sklearn 中的实现类是 ExtraTreesClassifier
#极端随机树-波士顿数据集
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
#导入数据
filename = 'data/boston_housing.csv'
names= ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename , names=names)
data=data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) #一定要清洗数据,否则数据中含有NAN就会报错
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:13]
Y = array[:,13]
Y = Y.astype(int).astype(float)#波士顿房价数据集的标签是浮点型的,但是计算中的方法要求整形的,所以会报错Unknown label type:‘continuous‘,网上看到这个解决办法,还没明白原理
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds, random_state=seed,shuffle=True)
num_tree = 100
max_features = 7
model = ExtraTreesClassifier(n_estimators=num_tree , random_state=seed,max_features=max_features)
result= cross_val_score(model , X, Y, cv=kfold)
print(result.mean())
#预测单个数据
model.fit(X,Y)
print(model.predict([data.values[39][:13]]))
打印结果如下:
PS C:\coding\machinelearning> & C:/Users/admin/anaconda3/envs/pytorch/python.exe c:/coding/machinelearning/极端随机树Boston.py
0.15478260869565216
[30.]
PS C:\coding\machinelearning>
最后说一句,之前的算法都是单独的算法,这次的装袋树算法(Bagging)和后面要讲的提升算法(Boosting)都是组合算法,它们都是在前面算法的基础上进行组合操作,从而提高算法的准确性。