如何在机器学习中处理缺失的数据?

时间:2017-02-06 21:36:27

标签: python pandas machine-learning scikit-learn linear-regression

我有一个数据框,在周五晚上9点到周一凌晨0点之间总是丢失信息。我使用这些数据通过线性回归算法进行预测,因此 jump 会预测我的预测:

                    date   timestamp   liters  next_liters
...
3442 2017-02-03 19:00:00  1486148400  0.86261      0.86354
3443 2017-02-03 20:00:00  1486152000  0.86354      0.86356
3444 2017-02-03 21:00:00  1486155600  0.86356      1.86330
3445 2017-02-06 00:00:00  1486339200  1.86330      1.86305
3446 2017-02-06 01:00:00  1486342800  1.86305      1.86321
3447 2017-02-06 02:00:00  1486346400  1.86321      1.86352
3448 2017-02-06 03:00:00  1486350000  1.86352      1.86311
3449 2017-02-06 04:00:00  1486353600  1.86311      1.86271
...

我想知道如何处理这个问题,因此在通过算法处理数据时,周五到周一不会被考虑在内。

我将这些值转换为NaN,但是,正如您所知,sklearn不允许这样的信息。

这是我目前的代码:

df = df[['date', 'epoch', 'liters']]
df['next_liters'] = df['liters'].shift(-1)

df.dropna(inplace=True)

X = np.array(df.drop(['next_liters'], 1))
X = preprocessing.scale(X)

y = np.array(df['next_liters'])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

clf = LinearRegression(fit_intercept=True, n_jobs=-1)
clf.fit(X_train, y_train)

print ("LinearRegression (" + str(clf.score(X_test, y_test)) + ")")
print (clf.predict(X_test))

1 个答案:

答案 0 :(得分:0)

我们可以通过内置函数的pandas获取工作日,从中创建一个新列,过滤df以排除“saturday”和“sunday”,然后再次过滤以丢弃任何大于20:59:59的日期星期五。

这当然与ML无关,但只是一些与熊猫的索引。

df['weekday'] = df['date'].dt.dayofweek
df = df[(df['date'] <5)]

现在我们需要在周五晚上21:00:00(工作日= 4)过滤任何内容。我们可以通过抓住我们时间戳的小时来做到这一点(不是很优雅,但我需要重新制作一个新专栏,我敢肯定有更简洁的方法!)

def hr_func(ts):
    return ts.hour

df['hour'] = df['date'].apply(hr_func)

df = df[(df['weekday'] !=4 ) | (df['hour'] <21)
df.head()

换句话说,如果不是星期五,请保留,如果是星期五但晚上9点之前,请保留它。

我很确定这应该有效!

http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

“星期一= 0,星期日= 6”的星期几来自: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.weekday.html

Get weekday/day-of-week for Datetime column of DataFrame