【发布时间】:2019-09-29 11:05:11
【问题描述】:
如果我通过 train_test_split 函数使用数据运行一个简单的 dtree 回归模型,我会得到不错的 r2 分数和低 mse 值。
training_data = pandas.read_csv('data.csv',usecols=['y','x1','x2','x3'])
y = training_data.iloc[:,0]
x = training_data.iloc[:,1:]
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.33)
regressor = DecisionTreeRegressor(random_state = 0)
# fit the regressor with X and Y data
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
但是,如果我手动将数据文件拆分为两个文件 2/3 训练和 1/3 测试。有一个名为 human 的列,它给出的值是 1 到 9,我使用人类 1-6 进行训练,使用 7-9 进行测试
我得到负的 r2 分数和高 mse
training_data = pandas.read_csv("train"+".csv",usecols=['y','x1','x2','x3'])
testing_data = pandas.read_csv("test"+".csv", usecols=['y','x1','x2','x3'])
y_train = training_data.iloc[:,training_data.columns.str.contains('y')]
X_train = training_data.iloc[:,training_data.columns.str.contains('|'.join(['x1','x2','x3']))]
y_test = testing_data.iloc[:,testing_data.columns.str.contains('y')]
X_test = testing_data.iloc[:,testing_data.columns.str.contains('|'.join(l_vars))]
y_train = pandas.Series(y_train['y'], index=y_train.index)
y_test = pandas.Series(y_test['y'], index=y_test.index)
regressor = DecisionTreeRegressor(random_state = 0)
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
我期待的结果或多或少相同,而且两次调用的所有数据类型似乎都相同。
我错过了什么?
【问题讨论】:
-
您如何在手动示例中制作
test.csv和train.csv?两种方法之间的拆分是否完全相同? -
我所做的拆分是在记录的前 2/3 和最后 1/3 上手动进行的。然而,由 split 函数完成的拆分是在内部进行的,因此集合不同但大小相同....对象的类型不是我认为的实际数据
-
你为什么要这样做:
X_train = training_data.iloc[:, training_data.columns.str.contains('|'.join(['x1','x2','x3']))]?我认为这可能会让您一无所有...您是否检查过您的X_train在该行之后的样子?此外,一般来说,train_test_split会在数据集中存在某种顺序的情况下打乱行,以尝试获得标签的均匀分布。 -
如何从文件中拆分数据?
train_test_split随机拆分(统一采样数据)。如果您在某个特定位置拆分文件,您可能会得到不平衡的数据(例如,如果数据按y排序)或其他类似问题。 -
如果将参数
shuffle = False添加到X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.33)会得到类似的结果吗?