一、决策树与随机森林
决策树原理图如下:
一、信息熵函数:
可以分解为下式:
其中p(x)为某一事件发生的概率,H(x)单位为比特。从上式可以看出,信息熵越大,其发生的概率的不确定性越大。
二·、决策树的划分依据:
(1)、信息增益:
信息增益表示得知特征w的信息而使得类q的信息的不确定性减小的程度。
g(D,A)为特征A对训练集D的信息增益,H(D)为训练集D的信息熵,H(D|A)为在特征A给改定条件下D的信息条件熵
其中:
Ck表示属于某一类别的样本数。下面是公式运用案例:
D1,D2,D3分别为青年、中年、老年的信息熵
(2)、其余的依据:
信息增益比
回归树:平均误差最小
分类树:基尼系数、最小准则
三、实例应用
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
def detect():
"""
用决策树预测生死
:return:
"""
titain = pd.read_csv("./Kaggle6773/titanic/train.csv")
# 处理缺失值
titain["Age"].fillna(titain["Age"].mean(), inplace=True)
# 提取特征值与目标值
x = titain[["Pclass", "Age", "Sex"]]
y = titain["Survived"]
# 分割数据集
x_train, x_test, y_train, y_tset = train_test_split(x, y, test_size=0.25)
# print(x_train)
# 特征工程
dir = DictVectorizer(sparse=False)
x_train = dir.fit_transform(x_train.to_dict(orient="records"))
x_test = dir.transform(x_test.to_dict(orient="records"))
print(dir.get_feature_names())
# print(x_train)
# 用决策树预测准确率
DTC = DecisionTreeClassifier()
DTC.fit(x_train, y_train)
# 生成决策树结构文件
export_graphviz(DTC, out_file="./out.dot", feature_names=['Age', 'Pclass', 'Sex=female', 'Sex=male'])
四、优缺点
优点:
不需要将数据进行归一化处理;
可以查看最终形成决策树的结果
缺点:
在生成模型时容易过拟合,通常我们可以通过剪枝技术来减少过拟合程度
二、随机森林
集成学习可以通过生成多个模型(可以是不同种类的预测器)来解决单一的问题,生成的每一个模型可以独立的学习和做出预测处理,后将这些结果结合成单预测输出。随机森林就是这种原理,即将多个决策树进行组合,形成一个随机森林。其输出的类别是由个别树输出的类别与众数决定的(假设一共有五棵树,四棵树的输出为4,则最后结果即为4)
(一)建立过程
单个树建立的过程:
设一个数据集中有M个样本,N个特征
步骤一:随机的在数据集中复制出1个样本,共复制M次。由于是概率事件,故可能不会对整个数据集全覆盖
步骤二:随机的在N个特征中选择n(n<N)个特征。
上述抽样方式采用随机放回抽样(bootstrap)
(二)、演示样例:
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
def random():
"""
用随机森林进行预测
:return:
"""
titain = pd.read_csv("./Kaggle6773/titanic/train.csv")
# 处理缺失值
titain["Age"].fillna(titain["Age"].mean(), inplace=True)
# 提取特征值与目标值
x = titain[["Pclass", "Age", "Sex"]]
y = titain["Survived"]
# 分割数据集
x_train, x_test, y_train, y_tset = train_test_split(x, y, test_size=0.25)
# print(x_train)
# 特征工程
dir = DictVectorizer(sparse=False)
x_train = dir.fit_transform(x_train.to_dict(orient="records"))
x_test = dir.transform(x_test.to_dict(orient="records"))
print(dir.get_feature_names())
# 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)
gc.fit(x_train, y_train)
# 输出参数
print("预测的最好模型是", gc.best_estimator_)
print("预测的最好参数为:", gc.best_params_)
print("预测的最好结果是:", gc.best_score_)
(三)、优缺点分析
1、准确率相对较高
2、大数据集运行可靠
3、不需要对特征数量进行降维处理
4、能够分析出特征对结果的重要性