使用线性回归预测缺失值

时间:2018-08-27 06:57:44

标签: python pandas scikit-learn linear-regression predict

我有2012年至2014年的数据,但2014年缺少了一些月份。我想使用基于2012/2013年数据训练的线性回归模型来预测这些月份。

2014年6月至8月缺失,其值用''表示,因此我使用以下代码对其进行了清理,我还通过截取20个数据来将2012,2013更改为相同的形状:

data2014NaN=data2014['mob'].replace(' ', np.nan)
data2014CleanNaN = data2014NaN[data2014NaN.notnull()]
data2012[0:300]
data2013[0:300]

然后,我使用两年作为训练集来训练线性回归模型。

X = pd.concat([data2012[0:300], data2013[0:300]], axis=1, join='inner')
y = data2014CleanNaN .values
y = y.reshape(-1,1)
from sklearn.model_selection import train_test_split  

# Split into 75% train and 25% test
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    train_size=0.75,
                                                    random_state=4)  
lm = LinearRegression()
lm.fit(X_train,y_train)
score = lm.score(X_test,y_test)
print("The prediction score on the test data is {:.2f}%".format(score*100))

但是我得到的结果是糟糕的4.65%,而且我不太确定如何解决此问题,我认为在削减2012年和2013年的数据时我做错了事

我在这里附加了数据(这只是虚拟数据):

2014:
date       value
29/01/2014 10
30/01/2014 20
31/01/2014 15
1/02/2014  ' '


2012:
date       value
29/01/2014 15
30/01/2014 18
31/01/2014 19
1/02/2014  50

我只使用数值数据,不确定我的方向是否正确

最好的问候

1 个答案:

答案 0 :(得分:0)

您的R ^ 2似乎不太好。

在这种情况下,三次样条插值的效果可能优于线性回归。
在python中,此api可以称为:

 import scipy.interpolate as st

source

此外,如果x是时间戳,而y是一个值,则可以尝试进行时间序列分析(例如AR或ARMA)以及神经网络方法(例如RNN和LSTM)。

由keras构建的LSTM示例:

model = Sequential()
model.add(LSTM(activation='tanh',input_shape = dataX[0].shape, output_dim=5, return_sequences = False))
model.add(Dense(output_dim = 1))
model.compile(optimizer='adam', loss='mae',metrics=['mse']) 
model.fit(dataX , dataY, epochs = times , batch_size=1, verbose = 2,shuffle=False)
y_pred = model.predict(dataX)