You*_*bit 1 python classification machine-learning decision-tree scikit-learn
我是机器学习新手,也是Kaggle 上泰坦尼克号问题的新手。我编写了一个简单的算法来预测测试数据的结果。
我的问题/困惑是,每次我使用相同的数据集和相同的步骤执行算法时,得分值都会发生变化(代码中的最后一条语句)。我无法理解这种行为?
代码:
# imports
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# load data
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
results = pd.read_csv('gender_submission-orig.csv')
# prepare training and test dataset
y = train['Survived']
X = train.drop(['Survived', 'SibSp', 'Ticket', 'Cabin', 'Embarked', 'Name'], axis=1)
test = test.drop(['SibSp', 'Ticket', 'Cabin', 'Embarked', 'Name'], axis=1)
y_test = results['Survived']
X = pd.get_dummies(X)
test = pd.get_dummies(test)
# fill the missing values
age_median = X['Age'].median()
fare_median = X['Fare'].median()
X['Age'] = X['Age'].fillna(age_median)
test['Age'].fillna(age_median, inplace=True)
test['Fare'].fillna(fare_median, inplace=True)
# train the classifier and predict
clf = DecisionTreeClassifier()
clf.fit(X, y)
predict = clf.predict(test)
# This is the score which changes with execution.
print(round(clf.score(test, y_test) * 100, 2))
Run Code Online (Sandbox Code Playgroud)
这是该领域的新手通常会面临的挫败感。原因是此类算法固有的随机性,正如评论中已经建议的那样,简单直接的补救措施是显式设置随机数生成器的状态(种子),例如:
clf = DecisionTreeClassifier(random_state=42)
Run Code Online (Sandbox Code Playgroud)
但随着数值的不同,分数也会发生变化。那么我们如何找到最佳或正确的值呢?
再说一次,这是预料之中的,而且无法克服:这种随机性是一种基本且不可逆转的随机性,超越它你根本无法超越。按照上面的建议设置随机种子只是确保特定模型/脚本的可重复性,但是找到您在这里所说的意义上的任何“最佳”值(即关于随机部分)是不可能的。从统计学上来说,不同的随机种子值产生的结果应该是相似的(在统计意义上),但这种相似性的精确量化是严格统计的一项练习,远远超出了本文的范围。
随机性通常是一个非直观的领域,随机数生成器 (RNG) 本身就是奇怪的动物......作为一般说明,您可能有兴趣知道RNG 甚至在不同的语言和框架之间“不兼容”。
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |