我正在编写一个脚本,用于预测服务器在未来某一天的磁盘使用百分比。每天的使用百分比是通过以下命令获取的:
$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 30G 24G 4.4G 85% /
并与日期一起记录。脚本是用Python编写的,简而言之,当我使用LinearRegression作为分类器时,得分非常低。代码如下:
import pandas as pdimport numpy as npfrom sklearn import preprocessing, cross_validation, svmfrom 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 reshapeX = 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 valueprint clf.predict(np.array([30]).reshape(-1,1))
输出结果为:
-0.19521578836110454[81.22057369]
其中clf.score
每次都是负值。我希望得到一个正值,并且至少达到0.95或更高,这样我才能对预测结果有信心。我不确定是使用了错误的分类器、需要更多数据、需要更多特征,还是代码中其他地方出了问题。
有趣的是,如果我将初始结果列表修改为具有更多线性增长的百分比使用率,例如:
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%的使用率,或者我简要阅读了关于“时间序列预测”的内容,尽管我不确定这是否符合标准(我是机器学习新手…)。我很灵活,只是真的在质疑我的设置有什么问题,是否需要完全采取新的方法。
感谢任何建议和改进代码的具体编辑。
回答:
当你使用线性回归时,你实际上只是在数据上拟合一条线。如果数据不是线性的,那么这不是一个好方法。注意你的数据相对于天数不是线性的:
在你的数据上拟合一条线(即进行LinearRegression)会得到一条不是很好地预测你数据的线:
然而,你的数据中有一些更线性的子集。例如,如果你从第8天开始使用线性回归,那么你会得到以下线:
你的“得分”会大幅上升。在这个数据子集上运行你的代码1000次,平均得分为0.875857。你可能需要建立一个模型来考虑这样一个事实:当达到某个百分比时,用户可能会删除文件以释放更多空间。