决策树
原理(信息论)
-
信息熵
- 信息:消除随机不定性的东西
- 信息熵公式,单位bit
H ( X ) = − ∑ i = 1 n ( P ( x i ) log b P ( x i ) ) H(X)=-\sum^{n}_{i=1}(P(x_i)\log_{b}P(x_i)) H(X)=−i=1∑n(P(xi)logbP(xi))
-
信息增益
- 特征A对训练数据集D的信息增益g(D,A)定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即
g ( D , A ) = H ( D ) − H ( D ∣ A ) H ( D , A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) g(D,A)=H(D)-H(D|A)\\ H(D,A)=\sum^n_{i=1}\frac{|D_i|}{|D|}H(D_i) g(D,A)=H(D)−H(D∣A)H(D,A)=i=1∑n∣D∣∣Di∣H(Di)
- 特征A对训练数据集D的信息增益g(D,A)定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即
-
决策树的划分依据:信息增益
- 其他
- ID3: 信息增益 最大准则
- C4.5: 信息增益比 最大准则
- CART: 基尼系数 最小准备 在sklearn中可以选择划分的默认原则
- 优势:划分更加细致
- 其他
-
优缺点
- 优点
- 简单的理解和解释,树木可视化
- 缺点
- 可能创建过于复杂的树 ,容易过拟合
- 改进:剪枝,随机森林
- 优点
API
class sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None, random_state=None)
# criterion:默认'gini',可以选择信息熵增益 ‘entropy’
-
代码示例 : 鸢尾花预测
from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris from sklearn import tree from sklearn.model_selection import train_test_split iris=load_iris() x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target) # 决策树并不需要对数据进行标准化 estimator = DecisionTreeClassifier(max_depth=3) estimator.fit(x_train,y_train) y_predict = estimator.predict(x_test) print(y_test==y_predict) print(y_predict) score=estimator.score(x_test,y_test) print('score=',score)
决策树可视化
from matplotlib import pyplot as plt
#...
fig=plt.figure()
tree.plot_tree(estimator)
plt.show()
集成学习方法之随机森林
原理
- 随机森林
- 包含多个决策树的分类器
- 随机
- 训练集随机
- BootStrap 随机有放回的抽样
- 特征随机
- 从M个特征中随机你抽取m个特征(M>>m)
- 训练集随机
- 总结
- 具有极好的准确率
- 能够有效地运行在大数据集上,而且不需要降维
API
sklearn.ensemble.RandomForestClassifier()
n_estimators
决策树的数量criteria
特征选择方法,默认ginimax_features='auto'
每个决策树的最大特征数量auto
max_features=sqrt(n_features)sqrt
max_features=sqrt(n_features)log2
max_features=log2(n_features)None
max_features=n_features
bootstrap=True
使用放回抽样min_samples
节点划分最少样本数min_samples_leaf
叶子节点的最小样本数
示例
使用随机森林和网格搜索预测鸢尾花
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
data=load_iris()
x_train,x_test,y_train,y_test =train_test_split(data.data,data.target)
params = {'n_estimators':[10,50,100,200,1000],
'max_depth':[3,5,8,11]}
clf = RandomForestClassifier()
clf = GridSearchCV(clf,param_grid=params,cv=10)
clf.fit(x_train,y_train)
y_predict = clf.predict(x_test)
score=clf.score(x_test,y_test)
print(y_test==y_predict)
print(score)
print(clf.best_params_,clf.best_score_)