Python scikit-learn:为什么我的LinearRegression分类器的得分这么低?

时间:2019-01-17 00:02:16

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

我正在编写一个脚本,该脚本将在给定将来日期的情况下预测服务器上已使用的磁盘空间%。每天从该命令中以每天1次的速度获取Use%,如下所示:

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              30G   24G  4.4G  85% /

,并与日期一起记录。该脚本是用Python编写的,但当我使用LinearRegression作为分类器时,它的缺点是得分很低。代码如下:

import pandas as pd
import numpy as np
from sklearn import preprocessing, cross_validation, svm
from sklearn.linear_model import LinearRegression

# list of tuples whose format is (day_of_month, percent_used)
results =  [(1, 83), (2, 87), (3, 87), (4, 87), (5, 89), (6, 88), (7, 83), (8, 75), (9, 73), (10, 73), (11, 74), (12, 77), (13, 77), (14, 79), (15, 79), (16, 79), (17, 79), (18, 79), (19, 80), (21, 80), (22, 81), (23, 84), (24, 85), (25, 85), (26, 85), (27, 85), (28, 85)]

labels = ['day', 'pct_used']
df = pd.DataFrame.from_records(results, columns=labels)

# convert list of days into a numpy array and reshape
X = np.array(df['day']).reshape(-1,1)

y = np.array(df['pct_used'])
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.4)
clf = LinearRegression(n_jobs=-1)
clf.fit(X_train, y_train)
print clf.score(X_test, y_test)
# predict day 30's pct_used value
print clf.predict(np.array([30]).reshape(-1,1))

并输出:

-0.19521578836110454
[81.22057369]

其中clf.score每次为负。我希望它能达到正值,并且至少为0.95或更高,以便对预测有信心。我不确定Im是否使用了错误的分类器,是否需要更多数据,需要更多功能或代码中是否有其他错误。

我发现有趣的是,如果我更改结果的初始列表以使pct_used线性增加,例如:

results = [(1, 73), (2, 73), (3, 74), (4, 75), (5, 76), (6, 77), (7, 78), (8, 78), (9, 80), (10, 80), (11, 81), (12, 82), (13, 83), (14, 84), (15, 85), (16, 85), (17, 85), (18, 86), (19, 86), (21, 87), (22, 88), (23, 89), (24, 89), (25, 90), (26, 91), (27, 91), (28, 92)]

然后用以下输出显示得分飞涨:

0.9852576797564747
[94.37028796]

因此,我认为LinearRegression仅在Y轴数据大部分为线性的情况下才能很好地用作分类器。当然,在现实世界中,磁盘空间会像原始数据集一样波动,因此这就是为什么我想也许我应该使用其他分类器,但是我尝试了sklearn.svm.SVR(),而且评分也很差。 / p>

我认为可以使用逻辑回归方法代替线性回归,该方法可能会在未来几天超过90%的使用率,或者没有使用。或者我简短地阅读了有关“时间序列预测”的信息,尽管我不确定这是否满足标准(我是机器学习的新手。)。我很灵活,只是在质疑我的设置有什么问题以及是否需要完全采用一种新方法。

感谢您提供任何建议和具体修改以改进代码。

1 个答案:

答案 0 :(得分:4)

使用线性回归时。您实际上只是在对数据进行拟合。如果数据不是线性的,那么它不是一个好方法。请注意,您的数据相对于日期不是线性的:

enter image description here

在您的数据上拟合一条线(即执行LinearRegression)会使您得出的那条线对您的数据不是一个很好的预测指标:

enter image description here

但是,您的数据子集更加线性。例如,如果您从第8天开始使用线性回归,则会得到以下代码行:

enter image description here

您的“得分”上升。将您的代码运行1000次(在该数据子集上),平均得分为.875857。您可能想提出一个模型,该模型说明以下事实:某个百分比的情况下,用户可能会删除文件以释放更多空间。