回归分析常量_机器学习实战之训练模型-多项式回归(一)

bdac9f224ec7d2b7ad056c61ed6baff2.png

如果数据比简单的直线更为复杂,我们也可以用线性模型来你和非线性数据。一个简单的方法就是将每一个特征的幂次方添加为一个新的特征,然后在这个拓展的特征集上进行线性拟合,这种方法成为多项式回归。

回归分析的目标是根据自变量(或自变量向量)x 的值来模拟因变量 y 的期望值。在简单的线性回归中,使用模型

其中ε是未观察到的随机误差,其以标量 x 为条件,均值为零。在该模型中,对于 x 值的每个单位增加,y 的条件期望增加

个单位。

在许多情况下,这种线性关系可能不成立。例如,如果我们根据合成发生的温度对化学合成的产率进行建模,我们可以发现通过增加每单位温度增加的量来提高产率。在这种情况下,我们可能会提出如下所示的二次模型:

通常,我们可以将 y 的期望值建模为 n 次多项式,得到一般多项式回归模型:

为了方便,这些模型从估计的角度来看都是线性的,因为回归函数就未知参数

等而言是线性的。因此,对于最小二乘分析,多项式回归的计算和推理问题可以使用多元回归技术完全解决,这是通过将
等视为多元回归模型中的独特自变量来完成的。

一、单个特征值

1.1 生成演示数据

我们举一个简单的例子,我们生成一些符合

数据(ε为高斯噪声)。
import 

3fe469bf5df3adcb5cf4af0190ef2886.png

1.2 生成新的特征

可以看出来,直线是不能拟合这个数据的,我们用Scikit-Learn的PolynomialFeatures对特征进行转换,将每一个特征的平方作为新的特征加入训练集。

from sklearn.preprocessing import PolynomialFeatures
pf = PolynomialFeatures(degree = 2,include_bias = False)
#include_bias:默认为True。如果为True的话,那么就会有常量为1的那一项。
#interaction_only: 默认为False,如果指定为True,那么就不会有特征自己和自己结合的项。
X_new = pf.fit_transform(X)

我们看看新的特征X_new

246f1af6fd9ea378fc1ed542ce4a614d.png

第一列为原来的X,第二列是X的平方。

1.3 用新的特征进行回归

现在新的特征集X_new包含来原来的特征X和该特征的平方,系那种对这个拓展的训练集匹配一个线性回归模型。

from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_new,y)
reg.intercept_
reg.coef_

输出:

e74c49fd6c7764d1103d979f4922597e.png

也就是我们拟合得到的模型是

,而我们原来的函数是
已经很不错的拟合了。

1.4 拟合效果

我们看看拟合的曲线。

plt.scatter(X,y,c='green', alpha=0.6)
plt.plot(X, reg.predict(X_new), color='r')
plt.show()

f844959ad257606383548889ef8b47f7.png

二、多个特征值

当存在多个特征值的时候,多项式回归能发现特征和特征之间的关系(线性回归做不到这个)。PolynomialFeatures会在给定的多项式的阶数下,添加所有的特征组合。如有两个特征a和b,阶数为3的情况下,PolynomialFeatures会添加

警告!!经过 PolynomialFeatures 之后, 样本特征呈指数增长,新增的特征包含了所有可能的样式。

接下来我们演示有两个特征的多项式回归模型的拟合。

2.1 生成演示数据

首先我们模拟两个正态分布的随机特征,通过函数

生成因变量y的数据,我们把X1和X2合并成X,并把X的里两个特征命名为x1和x2
X1 = 10 * np.random.rand(100,1) - 5
X2 = 2 * np.random.rand(100,1) - 9
y = 2 * X1 + 3 * X2 + 4 * X1**2 + 5 * X1*X2 + 6 * X2**2 + 7 + np.random.randn(100,1)
X = pd.DataFrame(np.c_[X1,X2])
X.columns=['x1','x2']

2.2 生成新的特征

针对x1和x2,生成包含

特征的df数据框
pf = PolynomialFeatures(degree=2).fit(X)
X_new = pf.transform(X)
clumns_list = pf.get_feature_names(X.columns)
features = pd.DataFrame(X_new, columns=clumns_list)

X_new是这样的

79e36bed806481eb774dfbf3bd72e7ad.png

获取X的列名

033008fe6c648984f03506caa2f0a7fe.png

通过PolynomialFeatures的get_feature_names得到遍历的符合PolynomialFeatures顺序的列名

752fc714e16ecd12f09ca5e69f775fc4.png

我们通过pd的DataFrame转换为df数据框,列名为clumns_list,最终的数据如下图:

e94158ec308e35ab31e5031d81820c66.png

2.3 用新的特征进行回归

reg = LinearRegression()
reg.fit(features,y)
reg.intercept_
reg.coef_

bc0e115dfab56868e7c9643d4e5f4b5e.png

回归得到的公式是


而我们原来的函数是:
还是有点差距的,但这里仅仅是说明这样的方法,不代表方法一定非常准确。
!!多个特征我们无法在平面画出拟合图。

2.4 数据标准化

因为新的拓展的特征的指数导致新的特征的绝对值非常大,数据的差距也会变动非常的大,所以我们要用标准化后的数据进行回归。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().fit(X_new)
X_new_std = scaler.transform(X_new)
features_std = pd.DataFrame(X_new_std, columns=clumns_list)
reg = LinearRegression()
reg.fit(features_std,y)
reg.intercept_

reg.coef_
如果用回归模型进行预测,输入的特征是包含拓展了的特征,并且也是标准化后的特征,如果有新的数据进入需要用拟合的方程进行预测, 要把新的数据按同样的规则生成新的特征,并把对应的特征做标准化处理。对新的特征的标准化处理方法:(数值-scaler.mean_)/np.sqrt(scaler.var_)

具体结果不演示了。

三、Pipeline

为了简化这个过程,Scikit-Learn中的 Pipeline 将这三个模型封装起来串联操作,让模型接口更加简洁,使用起来方便的减少代码量同时让机器学习的流程变得直观和更加的优雅。函数 PolynomialRegression() 中传入的超参数 degree 是用来指定所得的多项式回归中所用多项式的阶次。

dc4a869c9b38f2c31fcf201025a01c4e.png


pipeline最后一步如果有predict()方法我们才可以对pipeline使用fit_predict(),同理,最后一步如果有transform()方法我们才可以对pipeline使用fit_transform()方法。

3.1 生成模拟数据

我们同样用会第一部分的模拟数据

X = 10 * np.random.rand(100,1) - 5
X = np.sort(X,axis=0) ##为了方便作图,X和y的每一个组合的顺序没有关系的
y = 0.5* X ** 2 + 2 * X + 2 + np.random.randn(100,1)

3.2 建立模型

用6阶转换以及标准化后用线性模型

poly_reg = Pipeline([
("poly", PolynomialFeatures(degree=6)),
("std_scaler", StandardScaler()),
("lin_reg", LinearRegression())
])

3.3 拟合曲线

poly_reg.fit(X, y)
y_predict = poly_reg.predict(X)
plt.scatter(X,y, alpha=0.6)
plt.plot(X, y_predict, color='r')
plt.show()

78d7b91d05a5df20d8892bdf22835d9c.png

我们也可以得到模型的参数,可以通过参数把拟合方程描述处理,但如果用这个拟合方程预测,输入的新数据都要做特征转换和标准化,比较麻烦,直接用上面的poly_reg.predict(X)更方便。

01e3542e5a13ed07ce4c271658db7005.png

多项式回归的内容很多,过拟合、模型交叉检验、学习曲线等内容下篇再介绍。

### 回答1: encoder.fit_transform是指对数据进行编码和转换的操作。其中,encoder是指编码器,fit_transform是指对数据进行拟合和转换的操作。这个操作通常用于将非数值型数据转换为数值型数据,以便于进行机器学习等数据分析任务。 ### 回答2: encoder.fit_transform是机器学习中常用的方法之一,它结合了fit和transform两个步骤。在fit过程中,encoder会计算并保存数据集中的统计信息,例如均值和标准差,或者根据数据的分布情况进行概率估计。这个过程主要是为了训练模型,以便在后续的预测或转换中使用。 在transform过程中,encoder将根据fit过程中学到的统计信息,对新的数据进行转换。例如,对于数值型数据,它可以进行归一化或标准化处理,将数据映射到一个特定的范围内。对于分类数据,它可以将类别信息转换为数值型的编码形式,以便机器学习算法能够处理。 encoder.fit_transform的作用是将训练数据集进行拟合和转换,并返回转换后的数据。这个过程可以用于数据预处理,以便为机器学习算法提供更好的输入特征。它可以提高模型的性能和准确性,同时减少对异常值和噪声的敏感性。这个方法在许多机器学习任务中都可以使用,如分类、回归、聚类等。 需要注意的是,encoder.fit_transform只能用于训练集上的数据,不能直接在测试集或新数据上使用。在测试阶段,我们需要使用已经拟合好的encoder来对数据进行转换,因此需要先使用encoder.fit方法进行拟合,再使用encoder.transform对新数据进行转换。这样可以保证与训练集数据的处理方式一致,避免引入不一致性而导致的错误。 ### 回答3: encoder.fit_transform是机器学习中用于特征编码的一种方法。 在机器学习中,原始数据往往包含了文字、类别等非数值型的特征。然而,机器学习模型一般只能处理数值型数据。因此,需要将非数值型的特征进行编码,将其转换为数值型的特征,以便于机器学习模型进行处理。 encoder.fit_transform是编码过程中的一个步骤。在这个步骤中,首先需要使用encoder.fit()方法对原始数据进行拟合,以获取特征的编码规则。然后,使用encoder.transform()方法对原始数据进行转换,将非数值型的特征转换为数值型的特征。 这个过程中,encoder.fit_transform的作用就是同时进行fit和transform的操作。它可以根据原始数据进行拟合,并将原始数据转换为数值型的特征。这样,我们就可以将转换后的数据送入机器学习模型进行训练和预测了。 总而言之,encoder.fit_transform是一种用于特征编码的方法,通过对原始数据进行拟合和转换,将非数值型的特征转换为数值型的特征,以便于机器学习模型进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值