【问题标题】:sklearn Random Forest accuracy score identical for training and test datasklearn 随机森林准确度得分与训练和测试数据相同
【发布时间】:2017-10-13 12:42:05
【问题描述】:

我正在尝试为电动汽车充电事件数据构建分类模型。我想预测充电站是否会在给定时间点可用。我有以下代码工作:

from sklearn.ensemble import RandomForestClassifier
import pandas as pd

raw_data = pd.read_csv('C:/temp/sample_dataset.csv')
raw_test = pd.read_csv('C:/temp/sample_dataset_test.csv')
print ('raw data shape: ', raw_test.shape)

#choose which columns to dummify
X_vars = ['station_id', 'day_of_week', 'epoch', 'station_city',
 'station_county', 'station_zip', 'port_level', 'perc_local_occupancy',
 'ports_at_station', 'avg_charge_duration']
y_var = ['target_variable']
categorical_vars = ['station_id','station_city','station_county']

#split X and y in training and test
X_train = raw_data.loc[:,X_vars]
y_train = raw_data.loc[:,y_var]
X_test = raw_test.loc[:,X_vars]
y_test = raw_test.loc[:,y_var]

#make dummy variables
X_train = pd.get_dummies(X_train, columns = categorical_vars )
X_test = pd.get_dummies(X_test, columns=categorical_vars)

print('train size', X_train.shape, '\ntest size', X_test.shape)

# Train uncalibrated random forest classifier on whole train and evaluate on test data
clf = RandomForestClassifier(n_estimators=100, max_depth=2)
clf.fit(X_train, y_train.values.ravel())

print ('RF accuracy: TRAINING', clf.score(X_train,y_train))
print ('RF accuracy: TESTING', clf.score(X_test,y_test))

结果

raw data shape:  (1000000, 15)
train size (1000000, 125) 
test size (1000000, 125)
RF accuracy: TRAINING 0.831456
RF accuracy: TESTING 0.831456

我的问题是为什么训练和测试的准确率完全相同?我已经运行了很多次,它总是完全一样的。有任何想法吗? (我已经检查了确保原始数据不同)

【问题讨论】:

  • 没有关于raw_data 大小的信息。您是否希望在 raw_train 和 raw_test 集中有完全相同数量的观察?
  • 您正在测试和训练相同的数据。 X_train == X_test 是 True。使用 scikit-learn 的 test_train_split 函数或某种形式的交叉验证迭代器。

标签: python machine-learning scikit-learn random-forest metrics


【解决方案1】:

您是否可能在训练和测试文件中使用相同的数据集?

如果是相同的数据,那么最好将数据拆分为训练并使用 train_test_split 模块进行测试。

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

【讨论】:

    【解决方案2】:

    好吧,您的代码中只是一个错字,因为每次您选择所有行:

    #split X and y in training and test
    X_train = raw_data.loc[:,X_vars] 
    y_train = raw_data.loc[:,y_var]
    X_test = raw_test.loc[:,X_vars]
    y_test = raw_test.loc[:,y_var]
    

    你应该通过一些索引单独索引它们,例如:X_train = raw_data.loc[:idx,X_vars]

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2019-08-12
      • 2017-11-21
      • 2021-01-05
      • 2018-07-31
      • 2020-10-31
      • 2021-01-13
      • 2018-06-11
      • 2017-01-22
      相关资源
      最近更新 更多