如何拆分数据进行训练和测试?交叉验证可能吗? M估计还是OLS?
Posted
技术标签:
【中文标题】如何拆分数据进行训练和测试?交叉验证可能吗? M估计还是OLS?【英文标题】:How to split data to train and test ? Cross validation possible ? M-estimation or OLS? 【发布时间】:2019-03-04 11:33:17 【问题描述】:我有 26 个观察值来应用简单的线性回归,但是当我将数据拆分为 70% 的训练数据和 30% 的测试数据时,通常测试数据的结果(R 平方 / P 值)并不好。是因为测试的样本太少了吗? 8 或 9 次观察还不够?我该怎么办 ?没有随机状态,所以他的算法随机选择数据 还想知道如何在 OLS 和 M 估计之间进行选择(它更能抵抗我在下面的数据检查中遇到的异常值,因为变量 B 受除 A 之外的其他变量的影响)来申请我的数据集。 这是我到目前为止所做的代码,并希望在火车数据中进行交叉验证。 根据我的观察次数有可能吗?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from scipy import stats
data = pd.read_excel("C:\\Users\\AchourAh\\Desktop\\PL32_PMM_03_09_2018_SP_Level.xlsx",'Sheet1')
data1 = data.fillna(0) #Replace null values of the whole dataset with 0
print(data1)
X = data1.iloc[0:len(data1),1].values.reshape(-1, 1)
Y = data1.iloc[0:len(data1),2].values.reshape(-1, 1)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size =0.33)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, Y_train)
plt.scatter(X_train, Y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('SP00114585')
plt.xlabel('COP COR Quantity')
plt.ylabel('PAUS Quantity')
plt.show()
plt.scatter(X_test, Y_test, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('SP00114585')
plt.xlabel('COP COR Quantity')
plt.ylabel('PAUS Quantity')
plt.show()
X2 = sm.add_constant(X_train)
est = sm.OLS(Y_train, X2)
est2 = est.fit()
print(est2.summary())
X3 = sm.add_constant(X_test)
est3 = sm.OLS(Y_test, X3)
est4 = est3.fit()
print(est4.summary())
这是我拥有的数据的一个示例,我的目标不是预测一个好的模型,而是描述变量 A 对 B 的影响。此外,当一起分析整个数据时,结果总是比拆分数据更好
Variable A Variable B
87.000 573.000
90.000 99.000
258.000 339.000
180.000 618.000
0 69.000
90.000 621.000
90.000 231.000
210.000 345.000
255.000 255.000
0 0
213.000 372.000
405.000 405.000
162.000 162.000
405.000 405.000
0 186.000
105.000 252.000
474.000 501.000
531.000 531.000
549.000 549.000
525.000 525.000
360.000 660.000
546.000 546.000
645.000 645.000
561.000 600.000
978.000 1.104.000
960.000 960.000
此外,使用 SKlearn 绘制结果并根据 statsmodels 分析结果。我可以假设绘制的结果是由 statsmodels 的值表示的,还是代码中有一些需要更改的地方?
【问题讨论】:
一般来说 - 26 次观察实际上并没有多少指的是你的数字可以有的范围。 值以数量来解释。但是您如何假设 26 次观察对于简单的线性回归来说并不多? 因为您的值在 0 和 1104 之间变化,这就是为什么我认为您需要更多数据才能获得良好的近似值.. 您如何看待 OLS 或 M 估计来描述 Aon B 的影响以及由变量 B 引起的异常值问题,该问题受到变量 A 的其他变量的影响?交叉验证在我的情况下有用还是会破坏模型?随机状态怎么样,我应该这样不提吗? 对已发布数据的散点图的目视检查表明我看到了两组不同的数据。是否有理由将看起来像两个数据组的数据分成两个不同的回归? 【参考方案1】:Y=df["Column name"]
X=df[[ "All other Columns"]]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 465)
祝你好运
【讨论】:
以上是关于如何拆分数据进行训练和测试?交叉验证可能吗? M估计还是OLS?的主要内容,如果未能解决你的问题,请参考以下文章