【发布时间】: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