线性回归未按预期工作

时间:2019-09-27 13:43:13

标签: python machine-learning scikit-learn linear-regression

在200K的for循环中训练此模型,我可以得到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%。

我的主要疑问是,即使精度为70-97%,为什么我也能获得正确结果的20-45%。也许我会误解它的工作原理,有人可以澄清一下吗?

我正在使用的数据集:https://archive.ics.uci.edu/ml/datasets/Student+Performance

2 个答案:

答案 0 :(得分:1)

在回归中,您无法通过将预期的预测与实际目标相匹配来提高准确性。此方法用于分类任务。为了进行回归,您应该尝试使用MSE,MAE等指标评估模型。

答案 1 :(得分:1)

您的问题有几个问题。

首先,在回归设置(例如此处的设置)中,我们不使用术语“精确”和“准确性”,它们专用于分类问题(它们具有非常特定的含义,并且与同义词)。

话虽如此,下一步是为自己澄清指标是什么,即您的linear.score(x_test, y_test)返回的确切是什么;在这里,与其他许多类似设置一样,documentation是您最好的朋友:

  

score (自我,X,y,sample_weight =无)

     

返回预测的确定系数R ^ 2。

因此,您的度量标准是确定系数R ^ 2,或R平方。

尽管R ^ 2值为0.97听起来不错(有时 可以解释为97%,但这不是意味着“正确的预测”),像此处一样,在预测性设置中使用指标非常困难;引用我在another SO thread中的回答:

  

整个R平方的概念实际上直接来自统计学的世界,统计学的重点是解释性模型,而在机器学习的上下文中它很少使用,而重点是预测性模型;至少是AFAIK,除了一些非常入门的课程外,我从未(我的意思是从没 ...)见过预测性建模问题,其中R平方用于任何类型的绩效评估;流行的机器学习介绍(例如Coursera的Andrew Ng的Machine Learning)也不用不理会它,这不是偶然的。并且,如上文Github thread所述(强调):

     
    

尤其是在使用 test 集时,我对R ^ 2的含义有点不清楚。

  
     

我当然同意。

因此,最好使用一种针对预测性回归问题的标准指标,例如Mean Squared Error (MSE)Mean Absolute Error (MAE)-第二种优点是它与因变量的单位相同;由于这两个数量都是误差,因此表示更低的表现更好。看看可用的regression metrics in scikit-learn以及如何使用它们。

最后但并非最不重要的是,与上面的讨论无关,我看不出您实际上是如何对结果进行评估的:

Total: 40
Total correct predicts: 8

因为,如果我们应用截断规则(即15.49截断为15,但15.51截断为16),则我发现您的预测中大约有一半确实是“正确的” ...