哪种回归模型最适合这种通常的散点图但分布异常?
Which regression model(s) should be the most appropriate with this usual scatter plot but unusual distribution?
我需要将两个不同的回归模型拟合到以下 df
(例如属于两个不同系列的曲线)。
因此,考虑到我所知道的回归类型,有:
- 线性回归(下图中绿色的,只是为了展示)
- 多项式回归
- 岭回归
- 套索回归
- ElasticNet 回归
df
超级简单,只有两列x
和y
,每列450个条目。
散点图如下:
但是,当我完成 train/test 绘图过程时,我得到以下结果:
现在,很明显,简单的线性模型对于这样的 train/test 分布是不够的。
但是,当我开始研究 MSE(均方误差)时,我得到了一些有趣的东西:
Train Error: 0.06336815111266955
Test Error: 0.06359148208824823
我确定代码(我没有报告)。我用另一个玩具数据集检查了它并且工作得很好。
有人可以帮帮我吗?
非常感谢!
编辑:在模型拟合过程中,我在 [0,1]
范围内应用了 MinMaxScaler()
函数
不太确定哪里出错了,可能是训练/测试的组合或者拟合错误,下面我模拟了一些看起来像你的数据,你可以看到它有效:
import numpy as np
from sklearn import linear_model
import seaborn as sns
from sklearn.preprocessing import PolynomialFeatures
LR = linear_model.LinearRegression()
x = np.linspace(7, 15, num=100)
y = x + 2*x**2 + np.random.normal(0,5,size=100)
poly = PolynomialFeatures(2)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
clf = linear_model.LinearRegression()
clf.fit(poly.fit_transform(X_train.reshape(-1,1)), y_train)
pred_train = clf.predict(poly.fit_transform(X_train.reshape(-1,1)))
pred_test = clf.predict(poly.fit_transform(X_test.reshape(-1,1)))
我们可以绘制火车的结果:
df = pd.DataFrame({'x':X_train,'y':y_train,'pred':pred_train})
sns.scatterplot(x='x',y='y',data=df)
sns.lineplot(x='x',y='pred',data=df,color="orange")
df = pd.DataFrame({'x':X_test,'y':y_test,'pred':pred_test})
sns.scatterplot(x='x',y='y',data=df)
sns.lineplot(x='x',y='pred',data=df,color="orange")
我需要将两个不同的回归模型拟合到以下 df
(例如属于两个不同系列的曲线)。
因此,考虑到我所知道的回归类型,有:
- 线性回归(下图中绿色的,只是为了展示)
- 多项式回归
- 岭回归
- 套索回归
- ElasticNet 回归
df
超级简单,只有两列x
和y
,每列450个条目。
散点图如下:
但是,当我完成 train/test 绘图过程时,我得到以下结果:
现在,很明显,简单的线性模型对于这样的 train/test 分布是不够的。
但是,当我开始研究 MSE(均方误差)时,我得到了一些有趣的东西:
Train Error: 0.06336815111266955
Test Error: 0.06359148208824823
我确定代码(我没有报告)。我用另一个玩具数据集检查了它并且工作得很好。
有人可以帮帮我吗?
非常感谢!
编辑:在模型拟合过程中,我在 [0,1]
范围内应用了 MinMaxScaler()
函数
不太确定哪里出错了,可能是训练/测试的组合或者拟合错误,下面我模拟了一些看起来像你的数据,你可以看到它有效:
import numpy as np
from sklearn import linear_model
import seaborn as sns
from sklearn.preprocessing import PolynomialFeatures
LR = linear_model.LinearRegression()
x = np.linspace(7, 15, num=100)
y = x + 2*x**2 + np.random.normal(0,5,size=100)
poly = PolynomialFeatures(2)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
clf = linear_model.LinearRegression()
clf.fit(poly.fit_transform(X_train.reshape(-1,1)), y_train)
pred_train = clf.predict(poly.fit_transform(X_train.reshape(-1,1)))
pred_test = clf.predict(poly.fit_transform(X_test.reshape(-1,1)))
我们可以绘制火车的结果:
df = pd.DataFrame({'x':X_train,'y':y_train,'pred':pred_train})
sns.scatterplot(x='x',y='y',data=df)
sns.lineplot(x='x',y='pred',data=df,color="orange")
df = pd.DataFrame({'x':X_test,'y':y_test,'pred':pred_test})
sns.scatterplot(x='x',y='y',data=df)
sns.lineplot(x='x',y='pred',data=df,color="orange")