AI-机器学习-自学笔记(十)装袋算法

        装袋算法是一种提高分类准确度的算法,通过给定组合投票的方式获得最优解。比如你生病了去不同医院看了几个医生,每个医生都给你开了药方,最后哪个药方的出现次数多 ,就说明这个药方越有可能是最优解,这就是装袋算法的思想。

主要的三种装袋算法模型:

装袋决策树(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)都是组合算法,它们都是在前面算法的基础上进行组合操作,从而提高算法的准确性。

你可能感兴趣的:(AI自学笔记,人工智能,机器学习,算法)