sklearn随机森林准确性分数相同的训练和测试数据
问题描述:
我试图建立一个电动汽车充电事件数据的分类模型。我想预测充电站是否可以在特定的时间点使用。我有下面的代码工作:sklearn随机森林准确性分数相同的训练和测试数据
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
我的问题是,为什么是训练和测试精度完全一样?我跑了很多次,总是一模一样。有任何想法吗? (我已检查确保原始数据不同)
答
那么根本就在你的代码一个错字,因为每次你选择的所有行:
#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]
答
您是否有可能在列车和测试文件中使用同一组数据?
如果数据相同,那么最好将数据拆分为train并使用train_test_split模块进行测试。
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
有没有关于'raw_data'大小的信息。你是否期望在'raw_train'和'raw_test'集合中具有完全相同的观察数量? –
您正在测试和培训相同的数据。 'X_train == X_test'是'True'。使用scikit-learn的'test_train_split'函数或某种形式的交叉验证迭代器。 –