13机器学习——决策树、随机森林
如何划分是否能得到贷款?
猜谁是冠军?假设有32支球队
信息和消除不确定性是相联系的
信息熵越大,比如每个球队赢的概率都一样,那么不确定性也越大
当我得知一些信息的时候,比如每个队赢得的几率不同,不确定性就下降了
H(D)初始信息熵大小
针对银行贷款数据:
9/15:“是”的概率,
6/15:“否”的概率
H(D)= -(9/15×log(9/15)+6/15×log(6/15))
年龄有三个类别:青年,中年,老年,各占1/3
g(D,年龄)=H(D)-H(D’|年龄)=0.971-[1/3 ×H(青年)+1/3 ×H(中年)+1/3 ×H(老年)]
(信息熵都是针对类别来说的)
2/5:青年中类别“是”的比例
3/5:青年中类别“否”的比例
H(青年)=-(2/5×log(2/5)+3/5×log(3/5))
2/5:中年中类别“是”的比例
3/5:中年中类别“否”的比例
H(中年)=-(2/5×log(2/5)+3/5×log(3/5))
4/5:老年中类别“是”的比例
1/5:老年中类别“否”的比例
H(老年)=-(4/5×log(4/5)+1/5×log(1/5))
特征A3(有自己的房子)信息增益最大,所以作为决策树的第一个判定标准
决策树的分类依据之一:信息增益
基尼系数和信息增益相比,划分更加仔细
数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
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)
x_train=dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test=dict.transform(x_test.to_dict(orient='records'))
# print(x_train)
#用决策树进行预测
dec=DecisionTreeClassifier()
dec.fit(x_train,y_train)
#预测准确率
print("预测的准确率:",dec.score(x_test,y_test))
return None
if __name__=="__main__":
decision()
结果:
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pandas as pd
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)
x_train=dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test=dict.transform(x_test.to_dict(orient='records'))
# print(x_train)
#用决策树进行预测
dec=DecisionTreeClassifier()
dec.fit(x_train,y_train)
#预测准确率
print("预测的准确率:",dec.score(x_test,y_test))
#导出决策树的结构
export_graphviz(dec,out_file='./tree.dot',feature_names=['age','pclass1st','pclass=2nd','pclass=3rd','sex=female','sex=male'])
return None
if __name__=="__main__":
decision()
运行完就多出来一个tree.dot的文件
转换成图片:
可以设置树的深度:
dec=DecisionTreeClassifier(max_depth=8)
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
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)
x_train=dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test=dict.transform(x_test.to_dict(orient='records'))
# print(x_train)
#随机森林进行预测(超参数调优)
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()
结果: