如何拆分数据进行训练和测试?交叉验证可能吗? 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?的主要内容,如果未能解决你的问题,请参考以下文章

基于 python 中的多个特征的训练测试拆分的分层交叉验证或抽样

0-4 统计建模划分训练/验证/测试集的几种方法

数据集拆分:训练集、验证集、测试集

Scikit 学习交叉验证拆分

如何对数据应用交叉验证?

如何通过 LIBSVM 使用 platt 缩放和交叉验证?