(新手)决策树随机性

数据挖掘 Python 决策树
2022-03-07 22:04:01

我从数据科学开始,为了取得进展,我刚刚运行了Siraj Raval 的数据科学简介视频中的代码。他实现了一个简单的决策树分类器,但我不禁注意到,给定相同的训练集,分类器并不总是产生相同的预测(显然也不是相同的拟合);我碰巧觉得这很奇怪,因为根据我所学到的,决策树应该是确定性的。

我能想到的唯一可能导致随机性的事情是在某个时候随机选择分支,因为两个选项的值可能相同。我会说这可以通过更多的训练数据来纠正,但即使我再增加 5 个人,也没有任何改变。有人对发生的事情有解释吗?

以下是循环中视频中的代码(Python),用于计算决策树产生了for多少男性女性的预测。

from sklearn import tree
from sklearn.svm import SVC

n_male_pred_tree = 0
n_female_pred_tree = 0

n_male_pred_svm = 0
n_female_pred_svm = 0

for i in range (1,1000):
    # This loop tests the consistency of the CLF
    # The Decision Tree is not very consistent (It's 50-50)
    X = [[181,80,44],[177,70,43],[160,60,38],[154,54,37],
         [166,65,40],[190,90,47],[175,64,39],[177,70,40],
         [159,55,37],[171,75,42],[181,85,43]]

    Y = ['male','female','female','female',
         'male','male','male','female',
         'male','female','male']

    tree_clf = tree.DecisionTreeClassifier()
    svm_clf = SVC()

    tree_clf.fit(X,Y)
    svm_clf.fit(X,Y)

    tree_prediction = tree_clf.predict([[190,70,43]])
    svm_prediction = svm_clf.predict([[190,70,43]])

    if tree_prediction == 'male':
        n_male_pred_tree += 1
    else:
        n_female_pred_tree += 1

    if svm_prediction == 'male':
        n_male_pred_svm += 1
    else:
        n_female_pred_svm += 1

print(f"MALE pred Tree: {n_male_pred_tree}")
print(f"FEMALE pred for Tree: {n_female_pred_tree}")
print("\n")
print(f"MALE pred for SVM: {n_male_pred_svm}")
print(f"FEMALE pred for SVM: {n_female_pred_svm}")
1个回答

来自 sklearn:

每次拆分时,特征总是随机排列。因此,即使在相同的训练数据和 max_features=n_features 的情况下,如果在搜索最佳拆分期间列举的几个拆分的标准改进相同,则找到的最佳拆分可能会有所不同。为了在拟合期间获得确定性行为,必须固定 random_state。

如果您random_state在创建树对象时手动设置变量,您会发现它确实具有确定性。

简单来说,你提供给它的数据有点小,并且有几个拆分具有相同的信息增益,因此选择的拆分受随机因素的影响。