Python scikit-learn: почему мой классификатор LinearRegression так низок? - PullRequest
0 голосов
/ 17 января 2019

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

Спасибо за любые предложения и специальные изменения для улучшения кода.

1 Ответ

0 голосов
/ 17 января 2019

Когда вы используете линейную регрессию. Вы на самом деле просто подгоняете линию к данным. Если данные не линейные, то это не лучший метод. Обратите внимание, что ваши данные не являются линейными по отношению к дню:

enter image description here

Подгонка линии (т.е. выполнение LinearRegression) над вашими данными дает вам строку, которая не является хорошим предиктором ваших данных:

enter image description here

Однако есть подмножества ваших данных, которые являются более линейными. Например, если вы используете линейную регрессию с 8-го дня, вы получите следующую строку:

enter image description here

Ваш "счет" идет вверх. Выполнение кода 1000 раз (для этого подмножества данных) дает в среднем 0,875857 баллов. Возможно, вы захотите придумать модель, которая учитывает тот факт, что при определенном проценте пользователь, вероятно, удалит файлы, чтобы освободить больше места.

...