如何拆分数据进行训练和测试?交叉验证可能吗? M估计还是OLS?

时间:2018-09-28 12:56:02

标签: python scikit-learn linear-regression statsmodels

我有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值表示吗,或者代码中有什么变化?

1 个答案:

答案 0 :(得分:0)

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)

祝你好运