我正在编写一个脚本,该脚本将在给定将来日期的情况下预测服务器上已使用的磁盘空间%。每天从该命令中以每天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%的使用率,或者没有使用。或者我简短地阅读了有关“时间序列预测”的信息,尽管我不确定这是否满足标准(我是机器学习的新手。)。我很灵活,只是在质疑我的设置有什么问题以及是否需要完全采用一种新方法。
感谢您提供任何建议和具体修改以改进代码。