【发布时间】:2020-12-11 16:03:54
【问题描述】:
我正在研究一个模型,该模型可以通过属性来预测汽车价格。我注意到LinearRegression 模型的预测因输入类型而异(numpy.ndarray、scipy.sparse.csr.csr_matrix)。
我的数据由一些数字和分类属性组成,没有 NaN。
这是一个简单的数据准备代码(我后面描述的每个案例都很常见):
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.linear_model import LinearRegression
# Splitting to test and train
X = data_orig.drop("price", axis=1)
y = data_orig[["price"]]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Numerical attributes pipeline
num_pipeline = Pipeline([ ("scaler", StandardScaler()) ])
# Categorical attributes pipeline
cat_pipeline = Pipeline([ ("encoder", OneHotEncoder(handle_unknown="ignore")) ])
# Complete pipeline
full_pipeline = ColumnTransformer([
("cat", cat_pipeline, ["model", "transmission", "fuelType"]),
("num", num_pipeline, ["year", "mileage", "tax", "mpg", "engineSize"]),
])
让我们构建一个LinearRegression 模型(X_train 和X_test 将是scipy.sparse.csr.csr_matrix 的实例):
...
X_train = full_pipeline.fit_transform(X_train)
X_test = full_pipeline.transform(X_test)
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression().fit(X_train, y_train)
pred = lin_reg.predict(X_test)
r2_score(y_test, pred) # 0.896044623680753 OK
如果我将X_test 和X_train 转换为numpy.ndarray,则模型的预测完全不正确:
...
X_train = full_pipeline.fit_transform(X_train).toarray() # Here
X_test = full_pipeline.transform(X_test).toarray() # And here
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression().fit(X_train, y_train)
pred = lin_reg.predict(X_test)
r2_score(y_test, pred) # -7.919935999010152e+19 Something is wrong
我还测试了DecisionTreeRegressor、RandomForestRegressor 和SVR,但问题只出现在LinearRegression。
【问题讨论】:
-
您的数据是私密的吗?不然可以分享一下吗?
-
@swag2198 这是来自 Kaggle 的公共数据集,您可以将其下载为 CSV 文件:raw.githubusercontent.com/dsonyy/ml-stuff/master/notebooks/… 或此处kaggle.com/adityadesai13/used-car-dataset-ford-and-mercedes
标签: python numpy machine-learning scikit-learn linear-regression