#sklearn 随机森林简单介绍
在强大的机器学习库sklearn中已经集成了决策树模型,所以我们可以利用该模块方便的实施决策树学习。下面介绍一些常用的方法:
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2,min_samples_leaf=1, max_features=None, random_state=None, min_density=None, compute_importances=None,max_leaf_nodes=None)
- criterion :规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”。
- max_depth :限定了决策树的最大深度,对于防止过拟合非常有用。
- min_samples_leaf :限定了叶子节点包含的最小样本数,这个属性对于防止上文讲到的数据碎片问题很有作用。 (因为随着树的深度增加,叶子上的样本数会越来越少)
模块中一些重要的属性方法:
- n_classes_ :决策树中的类数量。
- classes_ :返回决策树中的所有种类标签。
- feature_importances_ :feature的重要性,值越大那么越重要。
- fit(X, y, sample_mask=None, X_argsorted=None, check_input=True, sample_weight=None): 将数据集x,和标签集y送入分类器进行训练,这里要注意一个参数是:sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。
- get_params(deep=True) 得到决策树的各个参数。
- set_params(**params) 调整决策树的各个参数。
- predict(X) 送入样本X,得到决策树的预测。可以同时送入多个样本。
- transform(X, threshold=None): 返回X的较重要的一些feature,相当于裁剪数据。
- score(X, y, sample_weight=None) 返回在数据集X,y上的测试分数,正确率。
下面是一个应用的例子:
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
clf.predict([[2., 2.]])
利用python中的pydot模块可以方便的输出决策树的效果图,不过需要注意的是pyparsing必须是旧版本的,比如1.5,另外需要在电脑商安装Graphviz软件。下面是一个例子:
from sklearn.externals.six import StringIO
import pydot
dot_data = StringIO.StringIO()
tree.export_graphviz(clf, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")
- 当我们数据中的feature较多时,一定要有足够的数据量来支撑我们的算法,不然的话很容易overfitting
- 善用max_depth参数,缓慢的增加并测试模型,找出最好的那个depth。
- 善用min_samples_split和min_samples_leaf参数来控制叶子节点的样本数量,防止overfitting。
- 平衡训练数据中的各个种类的数据,防止被一个种类的数据支配。
RandomForestClassifier 的一些重要属性,方法:
#拆分训练集和测试集
feature_train, feature_test, target_train, target_test = train_test_split(feature, target, test_size=0.1, random_state=42)
#分类型决策树
clf = RandomForestClassifier(n_estimators = 8)
#训练模型
s = clf.fit(feature_train , target_train)
print s
#评估模型准确率
r = clf.score(feature_test , target_test)
print r
print '判定结果:%s' % clf.predict(feature_test[0])
#print clf.predict_proba(feature_test[0])
print '所有的树:%s' % clf.estimators_
print clf.classes_
print clf.n_classes_
print '各feature的重要性:%s' % clf.feature_importances_
print clf.n_outputs_