一.多项式回归
研究一个因变量与一个或多个自变量间多项式的回归分析方法,称为多项式回归(Polynomial Regression)。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。
多项式回归可以处理相当一类非线性问题,它在回归分析中占有重要的地位,因为任一函数都可以分段用多项式来逼近。
二.scikit-learn中的多项式回归和Pipeline
使用Pipeline将3步合在一起,非常方便直接调用,不用依次进行这三步。
scikit-learn没有提供多项式回归的类,使用Pipeline可以方便创建属于自己的多项式回归的类。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.uniform(-3, 3, size=100)
X = x.reshape(-1, 1)
y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
poly_reg = Pipeline([
("poly", PolynomialFeatures(degree=2)),
("std_scaler", StandardScaler()), #归一化
("lin_reg", LinearRegression()) #线性回归
])
y_predict = poly_reg.predict(X)
plt.scatter(x, y)
plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
plt.show()
绘制结果图:
三.过拟合、欠拟合
- 欠拟合:underfitting:算法所训练的模型不能完整表述数据关系
- 过拟合:overfitting:算法所训练的模型过多地表达了数据间地噪音关系
过拟合泛化能力弱。
把数据集分为训练集和测试集,如果测试集效果也很好,则泛化能力好。
四.学习曲线
def plot_learning_curve(algo, X_train, X_test, y_train, y_test):
train_score = []
test_score = []
for i in range(1, len(X_train)+1):
algo.fit(X_train[:i], y_train[:i])
y_train_predict = algo.predict(X_train[:i])
train_score.append(mean_squared_error(y_train[:i], y_train_predict))
y_test_predict = algo.predict(X_test)
test_score.append(mean_squared_error(y_test, y_test_predict))
plt.plot([i for i in range(1, len(X_train)+1)],
np.sqrt(train_score), label="train")
plt.plot([i for i in range(1, len(X_train)+1)],
np.sqrt(test_score), label="test")
plt.legend()
plt.axis([0, len(X_train)+1, 0, 4])
plt.show()
plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)
欠拟合训练集和测试集都误差较大,过拟合测试集拟合效果差。
五.交叉验证
在sklearn中使用交叉验证:
六.模型正则化(Regularization)
1.岭回归Ridge Regression
使系数不大,拟合曲线不那么陡峭