Я работаю над сценарием, который будет предсказывать используемое дисковое пространство% на сервере с учетом будущей даты. Использование% захватывается 1x / день из этой команды, как показано ниже:
$ 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%, использованный в ближайшие несколько дней, либо нет. Или я читаю кратко о «прогнозировании временных рядов», хотя я не уверен, соответствует ли это критериям или нет (я новичок в машинном обучении ..). Я гибок, просто действительно спрашиваю, что не так с моей настройкой и нужно ли мне вообще использовать новый подход.
Спасибо за любые предложения и специальные изменения для улучшения кода.