决策树之信息论
程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。
信息熵:信息和消除不确定性相关。
决策树的划分依据:信息增益–得知一个特征条件之后,减少的信息熵的大小。
常见决策树使用的算法:
ID3 信息增益最大的准则
C4.5 信息增益比 最大的准则
CART:
回归树:平方误差 最小
分类树:基尼系数 最小的准则 在sklearn中可以选择划分的原则 基尼系数划分更加仔细
sklearn决策树API
class sklearn.tree.DecisionTreeClassifier(criterion=‘gini’,max_depth=None,random_state=None)
决策树分类器
criterion:默认是‘gini’系数,也可以选择信息增益的熵‘entropy’
max_depth:树的深度大小
random_state:随机数种子
method:
decision_path:返回决策树的路径
def decision():
'''决策树对泰坦尼克号进行预测生死:
return:None'''
titan=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
##处理数据,找出特征值和目标值
x=titan[['pclass','age','sex']]
y=titan['survived']
print(x)
##缺失值处理
x['age'].fillna(x['age'].mean(),inplace=True)
##分割数据集到训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
##进行处理(特征工程) 特征-》类别one_hot编码
dict=DictVectorizer(sparse=False)
##转换成字典,fit_transform默认为字典的特征抽取
x_train=dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test=dict.fit_transform(x_test.to_dict(orient='records'))
print(x_train)
##用决策树进行预测
dec=DecisionTreeClassifier(max_depth=5)
dec.fit(x_train,y_train)
##预测准确率
print('预测的准确率:'dec.score(c_test,y_test))
return None
if __name__ == "__main__":
decision()
决策树可视化
1.sklearn.tree.export_graphivz()该函数能够到处DOT格式
tree.export_graphviz(estimator,out_file=‘tree.dot’,feature_names=[‘,’])
2.工具:(能够将dot文件转换为pdf、png)
安装graphviz
ubuntu:sudo apt-get install graphviz
3.运行命令
然后我们运行这个命令
¥dot-Tpngtree.dot-otree.png
随机森林
集成学习方法
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器、模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此由于任何一个单分类的做出预测。
随机森林:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
随机森林建立多个决策树过程:
单个树的建立过程:
1.随机在N个样本当中选择一个样本,重复N次 , 样本有可能重复。
2.随机在M个特征当中选出m个特征
随机森林API
class sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion=‘gini’,max_depth=None,bootstrop=True,random=None)
随机森林分类器
n_estimators: integer,optional(default=10)森林里的树木数量 120 200 300 500 800 1200 超参数1(常用的值)
criteria:string,可选(default=‘gini’)分割特征的测量方法
max_depth:integer或none,可选 树的最大深度 5,8,15,25,30 超参数2
max_features=‘auto’,每个决策树的最大特征数量
If ‘auto’,then ‘max_features=sqrt(n_features)’
If ‘sqrt’,then ‘max_features=sqrt(n_features)’ (same as ‘auto’)
If ‘log2’,then ‘max_features=log2(n_features)’
If ‘None’,then 'max_features=n_features
bootstrap:boolean,optional(default=True)是否在构建树时使用放回抽样
def decision():
'''决策树对泰坦尼克号进行预测生死:
return:None'''
titan=pd.read_csv('./train.csv')
##处理数据,找出特征值和目标值
print(titan.head())
x=titan[['Pclass','Age','Sex']]
y=titan['Survived']
print(x)
##缺失值处理
x['Age'].fillna(x['Age'].mean(),inplace=True)
##分割数据集到训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
##进行处理(特征工程) 特征-》类别one_hot编码
dict=DictVectorizer(sparse=False)
##转换成字典,fit_transform默认为字典的特征抽取
x_train=dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names_out())
x_test=dict.fit_transform(x_test.to_dict(orient='records'))
# print(x_train)
# ##用决策树进行预测
# dec=DecisionTreeClassifier(max_depth=5)
# dec.fit(x_train,y_train)
# ##预测准确率
# print('预测的准确率:',dec.score(x_test,y_test))
# ##导出决策树的结构
# #export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', '女性', '男性'])
#随机森林进行预测(超参数调优)
rf=RandomForestClassifier()
##网格搜索与交叉验证
param={'n_estimators':[120,200,300,500,800,1200],'max_depth':[5,8,15,25,30]}
gc=GridSearchCV(rf,param_grid=param,cv=2)
gc.fit(x_train,y_train)
print('准确率:',gc.score(x_test,y_test))
print('查看选择的参数模型:',gc.best_params_)
return None
if __name__ == "__main__":
decision()
优点:
能够有效运行在大数据上
具有极好的准确率
能够处理高维特征的输入样本,不需要降维
能够评估各个特征在分类问题上的重要性