Линейная регрессия не работает, как я ожидал - PullRequest
0 голосов
/ 27 сентября 2019

Тренируя эту модель в цикле for 200 Кб, я мог получить точность 0,97 (это означает 97%, я думаю?), Я сохранил ее в файле .pickle.Проблема в том, что это не похоже на обучение, потому что я получаю те же результаты даже без обучения модели и с точностью до 70-90%.Что ж, если бы я получил более высокую точность, я бы подумал, что это обучение, но, как я уже сказал, результат не меняется.

В любом случае, даже с точностью до 70-97% он дает только правильноерезультат ~ 20-45% всех данных.Как вы видите, я новичок в этом деле, и я следую учебному пособию по адресу: https://www.youtube.com/watch?v=3AQ_74xrch8

Вот код:

import pandas as pd
import numpy as np
import pickle
import sklearn
from sklearn import linear_model

data = pd.read_csv('student-mat.csv', sep=';')
data = data[['G1', 'G2', 'G3', 'studytime', 'failures', 'absences']]

predict = 'G3'

X = np.array(data.drop([predict], 1))
y = np.array(data[predict])

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.1)

# comment after train the model #
best_accuracy = 0
array_best_accurary = []
for _ in range(200000):
    x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size=0.1)

    linear = linear_model.LinearRegression()
    linear.fit(x_train, y_train)
    accuracy = linear.score(x_test, y_test)

    if accuracy > best_accuracy:
        best_accuracy = accuracy
        array_best_accurary.append(best_accuracy)
        with open('student_model.pickle', 'wb') as f:
            pickle.dump(linear, f)

print(max(array_best_accurary), '\n')
# #

# uncomment after train the model
# picke_in = open('student_model.pickle', 'rb')
# linear = pickle.load(picke_in)

print('Coeficient:\n', linear.coef_)
print('Intercept:\n', linear.intercept_, '\n')

predictions = linear.predict(x_test)

total = len(predictions)
correct_predictions = []

for x in range(total):
    print('Predict', predictions[x], '- Correct', y_test[x])

    if int(predictions[x]) == y_test[x]:
        correct_predictions.append(1)

print('\n')
print('Total:', total)
print('Total correct predicts:', len(correct_predictions))

И вывод:

0.977506233512022 

Coeficient:
 [ 0.14553549  0.98120042 -0.18857019 -0.31539844  0.03324807]
Intercept:
 -1.3929098924365348 

Predict 9.339230104273398 - Correct 9
Predict -1.7999979510132014 - Correct 0
Predict 18.220125096856393 - Correct 18
Predict 3.5669380684894634 - Correct 0
Predict 8.394034346453692 - Correct 10
Predict 11.17472103817094 - Correct 12
Predict 6.877027043616517 - Correct 7
Predict 13.10046638328761 - Correct 14
Predict 8.460530481589299 - Correct 9
Predict 5.619296478409708 - Correct 9
Predict 5.056861318329287 - Correct 6
Predict -0.4602308511632893 - Correct 0
Predict 5.4907111970972124 - Correct 7
Predict 7.098301508597935 - Correct 0
Predict 9.060702343692888 - Correct 11
Predict 14.906413508421672 - Correct 16
Predict 5.337146104521532 - Correct 7
Predict 6.451206767114973 - Correct 6
Predict 12.005846951225159 - Correct 14
Predict 9.181910373164804 - Correct 0
Predict 7.078728252841696 - Correct 8
Predict 12.944012673326714 - Correct 13
Predict 9.296195408827478 - Correct 10
Predict 9.726422674287734 - Correct 10
Predict 5.872952989811228 - Correct 6
Predict 11.714775970606564 - Correct 12
Predict 10.699461464343582 - Correct 11
Predict 8.079501926145412 - Correct 8
Predict 17.050354493553698 - Correct 17
Predict 11.950269035741151 - Correct 12
Predict 11.907234340295231 - Correct 12
Predict 8.394034346453692 - Correct 8
Predict 9.563804949756388 - Correct 10
Predict 15.08795365845874 - Correct 15
Predict 15.197484489040267 - Correct 14
Predict 9.339230104273398 - Correct 10
Predict 6.72710996076076 - Correct 8
Predict 15.778083095387622 - Correct 16
Predict 8.238497037369088 - Correct 9
Predict 11.357208854852361 - Correct 12


Total: 40
Total correct predicts: 8

Я знаю, что это число с плавающей точкой, но даже если я округлю его вверх или вниз, я все равно не получу ожидаемого результата.Я знаю, что мой код слишком прост, но даже если я рассмотрю прогноз == (требуемый прогноз - 1), в приведенном выше выводе он даст мне 27 правильных прогнозов, что составляет ~ 60% от общего числа.Разве это не слишком низко?Я ожидал бы что-то вроде 70-80%.

Мое главное сомнение в том, почему я получаю ~ 20-45% правильных результатов, даже если точность составляет 70-97%.Может быть, я неправильно понял, как это работает, кто-то может уточнить?

Набор данных, который я использую: https://archive.ics.uci.edu/ml/datasets/Student+Performance

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Есть несколько проблем с вашим вопросом.

Для начала, в настройках регрессии (например, у вас здесь) мы не используем термины «точность» и «точность», которые зарезервированы для классификации.проблемы (в которых они имеют очень специфические значения, и они далеки от синонимов).

Сказав это, ваш следующий шаг должен уточнить для себя, какова ваша метрика, то есть, что такое точно возвращается вашим linear.score(x_test, y_test);здесь, как и во многих других подобных настройках, документация является вашим лучшим другом:

score (self, X, y, sample_weight = None)

Возвращает коэффициент определения R ^ 2 прогноза.

Итак, ваша метрика - это коэффициент определения R ^ 2, или R-квадрат.

Хотя значение R ^ 2 0,97 звучит довольно хорошо (и его иногда можно интерпретировать как 97%, но это не означает "правильные прогнозы"), использованиеметрика в предиктивных настройках, как здесь, довольно проблематична;цитируя мой собственный ответ в другой ветке SO :

вся концепция R-квадрата фактически происходит непосредственно из мира статистики, где акцент делается на интерпретации моделей, и он мало используется в контексте машинного обучения, где акцент явно делается на прогнозирующих моделях;по крайней мере AFAIK, и помимо некоторых очень вводных курсов, я никогда (я имею в виду никогда ...) не видел проблемы прогнозирующего моделирования, где R-квадрат используется для любого вида оценки производительности;Также не случайно, что популярные машинное обучение , такие как Машинное обучение Эндрю Нг в Coursera, даже не удосужились об этом упомянуть.И, как отмечалось в потоке Github выше (выделение выделено):

В частности, при использовании набора test мне немного неясно, чтоR ^ 2 означает.

, с которым я, безусловно, согласен.

Итак, вам было бы лучше использовать одну из стандартных метрик для прогнозирующего проблемы регрессии, такие как средняя квадратическая ошибка (MSE) или средняя абсолютная ошибка (MAE) - вторая имеет преимущество в том, что она находится в тех же единицах, что и ваша зависимая переменная;поскольку обе эти величины ошибки , это означает чем меньше, тем лучше .Взгляните на доступные регрессионные метрики в scikit-learn и как их использовать.

Последнее, но не менее важное, и независимо от обсуждения выше, я не вижу, как вы на самом деле прибылипри этой оценке ваших результатов:

Total: 40
Total correct predicts: 8

, поскольку, если мы применяем правила усечения (т.е. 15,49 усекается до 15, но 15,51 усекается до 16), я вижу, что примерно половина ваших прогнозов действительно "правильна"»...

1 голос
/ 27 сентября 2019

В регрессии вы не берете точность, сопоставляя ожидаемый прогноз с фактической целью.Этот метод используется для задач классификации.Для регрессии вы должны попытаться оценить вашу модель, используя такие метрики, как MSE, MAE и т. Д.

...