当Scikit线性模型返回负分数时,是什么意思?

6
我是机器学习的新手,正在尝试使用Scikit提供的线性模型估算器来预测二手车价格。我使用了不同组合的线性模型,如LinearRegressionRidgeLassoElastic Net,但在大多数情况下,它们都返回负分数(-0.6 <= score <= 0.1)。
有人告诉我这是由于多重共线性问题,但我不知道如何解决它。
我的示例代码:
import numpy as np
import pandas as pd
from sklearn import linear_model
from sqlalchemy import create_engine
from sklearn.linear_model import Ridge

engine = create_engine('sqlite:///path-to-db')

query = "SELECT mileage, carcass, engine, transmission, state, drive, customs_cleared, price FROM cars WHERE mark='some mark' AND model='some model' AND year='some year'"
df = pd.read_sql_query(query, engine)
df = df.dropna()
df = df.reindex(np.random.permutation(df.index))

X_full = df[['mileage', 'carcass', 'engine', 'transmission', 'state', 'drive', 'customs_cleared']]
y_full = df['price']

n_train = -len(X_full)/5
X_train = X_full[:n_train]
X_test = X_full[n_train:]
y_train = y_full[:n_train]
y_test = y_full[n_train:]

predict = [200000, 0, 2.5, 0, 0, 2, 0] # parameters of the car to predict

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
y_estimate = model.predict(X_test)

print("Residual sum of squares: %.2f" % np.mean((y_estimate - y_test) ** 2))
print("Variance score: %.2f" % model.score(X_test, y_test))
print("Predicted price: ", model.predict(predict))

“Carcass”、“state”、“drive”和“customs cleared”是数字,代表不同的类型。

如何正确实现预测?可能需要进行一些数据预处理或尝试使用不同的算法。

感谢您提前的帮助!


由于对信号均值的错误估计等原因,样本外 R^2 分数可能为负。 - eickenberg
1个回答

3

如果您使用岭回归,应该使用StandardScaler或MinMaxScaler对变量进行缩放:

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

也许可以使用管道:

http://scikit-learn.org/stable/modules/pipeline.html#pipeline-chaining-estimators

如果您使用的是普通的回归模型,那么数据缩放并不重要;但是对于岭回归模型,正则化惩罚项(alpha)会根据变量的不同缩放程度进行处理。请参阅此处有关统计学的讨论:

https://stats.stackexchange.com/questions/29781/when-should-you-center-your-data-when-should-you-standardize


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接