回归问题总结

作者最近参加了DataFountain上的机器学习比赛——光伏电站人工智能运维大数据处理分析。比赛的大致任务是根据赛方给出的光照强度度、光伏板工作温度等影响特征下,建立回归预测模型,预估光伏电站瞬时发电量。赛方给出的数据集不大,训练集1.1MB,测试集896KB(训练集和测试集下载)。比赛的评估指标是RMSE,

$$RMSE = sqrt{frac{sum_{i=1}^n (X_{obs, i} - X_{model, i})^2}{n}}$$

$$score = frac{1}{1 + RMSE}$$

本文希望根据这个比赛,实验一下各种回归算法的性能和优缺点。本文不侧重于理论,具体各个算法的原理,作者后续会慢慢补充。

普通最小二乘法

LinearRegression拟合一个带有系数$omega = (omega_1, …, omega_p)$的线性模型,使得数据集实际观测数据和预测数据(估计值)之间的残差平方和最小。其数学表达式为:

$$min limits_{omega} {vertvert X omega - y vertvert _2}^2$$

普通最小二乘的系数估计问题,其依赖于模型各项的相互独立性。当各项是相关的,且设计矩阵$X$的各列近似线性相关,那么,设计矩阵会趋向于奇异矩阵,这会导致最小二乘估计对于随机误差非常敏感,产生很大的方差。

1
2
3
clf = LinearRegression()

cv_score = cross_val_score(clf, X_scaled, y_train, cv=5, scoring=my_scorer)

使用StandardScaler和使用MinMaxScaler对分数影响不大,最终的得分为0.48058952612492983。

岭回归

Ridge回归通过对系数的大小施加惩罚来解决普通最小二乘法的一些问题。 岭系数最小化的是带罚项的残差平方和,

$$min limits_{omega} {vertvert X omega - y vertvert _2}^2 + alpha {vertvert omega vertvert _2}^2$$

其中, $alpha > 0$是控制系数收缩量的复杂性参数:$alpha$的值越大,收缩量越大,这样系数对共线性的鲁棒性也更强。

1
2
大专栏  回归问题总结lass="line">3
4
5
clf = Ridge(alpha=1)

X_minmax = MinMaxScaler().fit_transform(X_train)

cv_score = cross_val_score(clf, X_minmax, y_train, cv=5, scoring=my_scorer)

使用StandardScaler的分数为0.4845265337839891,使用MinMaxScaler分数可以达到0.6795703625485946。

多项式回归

机器学习中一种常见的模式,是使用线性模型训练数据的非线性函数。这种方法保持了一般快速的线性方法的性能,同时允许它们适应更广泛的数据范围。

例如,可以通过构造系数的polynomial features来扩展一个简单的线性回归。在标准线性回归的情况下,你可能有一个类似于二维数据的模型:

$$hat{y} (omega, x) = omega_0 + omega_1 x_1 + omega_2 x_2$$

如果我们想把数据拟合成二次函数,我们可以结合二阶多项式的特征,使模型看起来像这样:

$$hat{y} (omega, x) = omega_0 + omega_1 x_1 + omega_2 x_2 + omega_1 x_1 x_2 + omega_2 x_1^2 + omega_2 x_2^2$$

观察到这 还是一个线性模型 (这有时候是令人惊讶的): 看到这个,想象创造一个新的变量

$$z = [x_1, x_2, x_1 x_2, x_1^2, x_2^2]$$

有了这些重新标记的数据,我们可以将问题写成

$$hat{y} (omega, x) = omega_0 + omega_1 z_1 + omega_2 z_2 + omega_1 z_3 + omega_2 z_4 + omega_2 z_5$$

我们看到,所得的polynomial regression与我们上文所述线性模型是同一类(即关于$omega$是线性的),因此可以用同样的方法解决。通过用这些基函数建立的高维空间中的线性拟合,该模型具有灵活性,可以适应更广泛的数据范围。

1
2
3
4
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X_train)
clf = LinearRegression()
cv_score = cross_val_score(clf, X_poly, y_train, cv=5, scoring=my_scorer, n_jobs=5)

该方法在本问题中效果不好,不过可以考虑将PolynomialFeatures用在Lightgbm等算法上。

猜你喜欢

转载自www.cnblogs.com/lijianming180/p/12037730.html