Python保存不同阶数多项式回归模型时所有模型均为15阶问题排查
问题原因
- 重复使用同一个线性回归实例:你在循环外仅初始化了一次
LinearRegression实例,sklearn估计器的fit方法是原地修改实例的训练参数(系数、截距等),你往列表里添加的都是同一个实例的引用,所有元素最终会和最后一次训练的15阶模型参数完全一致。 - append调用逻辑错误:你写的
model.append(models)是完全错误的语法,LinearRegression实例没有append方法,你应该调用列表的append方法将训练好的模型加入列表,正确写法为models.append(model)。
修正后代码
import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import PolynomialFeatures from sklearn.metrics import r2_score from sklearn.metrics import mean_squared_error as MSE df = pd.read_csv("kc_house_train_data(1).csv") X = df['sqft_living'].values Y = df['price'].values def Poly(X, degree): poly = PolynomialFeatures(degree = degree) poly_X = poly.fit_transform(X.reshape(-1,1)) return poly_X models = [] for i in range(15): poly_X = Poly(X, i+1) # 每次循环都初始化新的线性回归实例,避免参数覆盖 lm = LinearRegression() model = lm.fit(poly_X, Y) # 正确把模型加入列表 models.append(model)
补充说明
如果需要后续对应不同阶数的模型,可以把列表改成字典,key存阶数,value存模型,调用时更方便:
models = {} for i in range(15): degree = i+1 poly_X = Poly(X, degree) lm = LinearRegression() models[degree] = lm.fit(poly_X, Y)
内容的提问来源于stack exchange,提问作者Benjamin Gorman
相关产品推荐
相关产品推荐

