第42集 python机器学习:交互式特征和多项式特征
作者头像
  • 极客飞机
  • 2019-11-01 09:18:07 2

为了满足您的需求,我将对原文进行改写,使其更加简洁且不与原文过于相似,同时确保信息准确无误。


为了增强线性模型的特性表示,一种常见做法是引入原始数据的交互特征和多项式特征。这类特征工程在统计建模和机器学习实践中广泛应用。

线性模型不仅能够处理偏移量的学习,还可以处理斜率的学习。例如,在分箱数据上的线性模型中,我们可以重新加入原始特征,以适应不同的斜率。下面是一个示例:

```python from sklearn.linearmodel import LinearRegression from sklearn.tree import DecisionTreeRegressor from mglearn.datasets import makewave

x, y = makewave(nsamples=150) line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)

reg = DecisionTreeRegressor(minsamplessplit=3).fit(x, y) plt.plot(x[:, 0], y, 'o', c='k') plt.ylabel("Regression output") plt.xlabel("Input feature")

bins = np.linspace(-3, 3, 11) which_bin = np.digitize(x, bins=bins)

from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder(sparse=False) encoder.fit(whichbin) xbinned = encoder.transform(which_bin)

line_binned = encoder.transform(np.digitize(line, bins=bins))

reg = LinearRegression().fit(xbinned, y) plt.plot(line, reg.predict(linebinned), label='Linear regression binned')

reg = DecisionTreeRegressor(minsamplessplit=3).fit(xbinned, y) plt.plot(line, reg.predict(linebinned), label='Decision tree binned') plt.plot(x[:, 0], y, 'o', c='k') plt.vlines(bins, 3, -3, linewidth=1, alpha=.2) plt.legend(loc="best") ```

通过分箱特征和单一斜率的线性回归,模型在每个箱子中学习一个偏移量和一个统一的斜率。为了使每个箱子有不同的斜率,我们可以添加交互特征或乘积特征,这些特征结合了箱子指示符和原始特征。

```python xproduct = np.hstack([xbinned, xx_binned]) reg = LinearRegression().fit(x_product, y) line_product = np.hstack([line_binned, lineline_binned])

plt.plot(line, reg.predict(line_product), label='Linear regression product') for bin in bins: plt.plot([bin, bin], [-3, 3], ':', c='k') plt.plot(x[:, 0], y, 'o', c='k') plt.legend(loc="best") ```

另一个扩展连续特征的方法是使用多项式特征。通过引入多项式特征,如x^2, x^3等,可以在模型中引入更多的灵活性。在sklearn.preprocessing模块中的PolynomialFeatures可以实现这一功能。

```python from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=10, includebias=False) poly.fit(x) xpoly = poly.transform(x)

print("xpoly.shape:", xpoly.shape) print("Entries of x:", x[:5]) print("Entries of xpoly:", xpoly[:, 5]) print("Poly feature names:n", poly.getfeaturenames())

reg = LinearRegression().fit(xpoly, y) linepoly = poly.transform(line) plt.plot(line, reg.predict(line_poly), label='Polynomial regression') plt.plot(x[:, 0], y, 'o', c='k') plt.legend(loc="best") ```

通过多项式特征,我们可以获得平滑的拟合效果。然而,高阶多项式可能会在数据稀疏区域产生极端结果。作为对比,我们还可以尝试使用支持向量机(SVM):

python from sklearn.svm import SVR for gamma in [1, 10]: svr = SVR(gamma=gamma).fit(x, y) plt.plot(line, svr.predict(line), label='SVR gamma={}'.format(gamma)) plt.plot(x[:,0], y, 'o', c='k') plt.legend(loc="best")

通过SVM模型,我们可以获得与多项式回归相似的复杂度预测结果,而无需显式地进行特征变换。


希望这段改写的内容符合您的需求。

    本文来源:图灵汇
责任编辑: : 极客飞机
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
特征多项式交互式机器python学习
    下一篇