【问题标题】:Python scikit-learn: Why is my LinearRegression classifier's score so low?Python scikit-learn:为什么我的 LinearRegression 分类器的分数这么低?
【发布时间】:2019-06-11 03:18:17
【问题描述】:

我正在编写一个脚本,该脚本将在给定未来日期的情况下预测服务器上已用磁盘空间的百分比。 Use% 是从这个命令中获取 1x/day 的,如下所示:

$ 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 或更高,这样我才能对预测充满信心。我不确定我是否使用了错误的分类器,需要更多数据,需要更多功能,或者在代码中做错了什么。

我发现的一些有趣的事情是,如果我将结果的初始列表更改为具有更线性增加的 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(),结果也很差。

我认为逻辑回归方法可以代替线性回归,它可能在接下来的几天内使用超过 90% 或不使用。或者我简要阅读了有关“时间序列预测”的内容,尽管我不确定这是否符合标准(我是机器学习的新手……)。我很灵活,只是真的质疑我的设置有什么问题,以及我是否需要完全采用新方法。

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

【问题讨论】:

  • 您是否尝试过绘制数据?总体上绝对不是线性的(如果您只是使用 day 作为功能)。如果可以的话,您可能应该获得更多功能。

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


【解决方案1】:

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

在您的数据上拟合一条线(即进行线性回归)会给您一条不能很好地预测您的数据的线:

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

你的“分数”上升了。运行你的代码 1000 次(在这个数据子集上)得到 0.875857 的平均分数。您可能想提出一个模型来解释这样一个事实,即在某个百分比下,用户可能会删除文件以释放更多空间。

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 2016-02-11
    • 2019-06-09
    • 2021-05-06
    • 2021-12-29
    • 2020-08-27
    • 2015-06-09
    • 2020-02-05
    • 2017-02-01
    相关资源
    最近更新 更多