在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

最佳答案

您的问题有几个问题。

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

话虽如此,下一步是为自己弄清楚指标是什么,即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中所述(加了强调):
  
  
    特别是在使用测试集时,我不清楚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),则我发现您的预测中大约有一半确实是“正确的” ...

关于python - 线性回归未按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58135795/

10-12 17:39