决策树
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。
源代码:
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pandas as pd
def decision():
"""
决策树对坦坦尼克号进行预测生死
"""
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_train=dict.transform(x_train.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=['年龄','pclass=lst','pclass=2nd','pclsdd=3rd','女性','男性'])
return None
if __name__=="__main__":
decision()
运行:
准确率:
信息的度量和作用:
假设有三十二支球队,猜谁是冠军。
每猜一次给一块钱,告诉我是否猜对了,那么我我需要多少钱才能知道谁是冠军?
我们可以把求编上号,从1到32.然后提问:冠军在1-16号嘛?依次询问,只需要五次,就可以知道结果。
log32=5比特。
信息熵:
信息和消除不确定性是相联系的
信息增益:当得知一个特征条件之后,减少的信息熵的大小。
信息增益的计算:
例:
决策树的分类依据之一:信息增益。
基尼系数:划分更加仔细。
常见决策树使用的算法:
sklearn决策树API:
例:
数据网址:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
分类模型:
决策树的结构、本地保存
树的结构:
决策树的优缺点:
剪枝:
随机森林
随机森林:是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
过程:
单个树:(N个样本,M个特征)
- 随机在N个样本中选择一个样本,重复N次。
- 随机在M个特征中选出m个特征。
多个决策树:(10棵决策树,样本,特征大多不一样)
随机又放回的抽样,采取bootstrap抽样。
为什么要随机抽样:
为什么要有放回的抽样:
集成学习方法:
随机森林API
源代码:
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
def decision():
"""
决策树对坦坦尼克号进行预测生死
"""
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_train=dict.transform(x_train.to_dict(orient="records"))
# print(x_train)
#用随机森林去预测(超参数调优)
rf = RandomForestClassifier{"n_estimators":[120,200,300,500,5800,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()
运行:
随机森林的优点:
缺点:
选不到一个合适的参数。