PCA
作用:降维降低数据量,降低处理时间; 降噪功能
使用方法:
from sklearn.decomposition import PCA # 引入PCA
pca = PCA(0.95) # 根据比例算出pca降维量
pca.fit(x_train) # 进行计算出降维量
pca.n_components_ # 降维后的量
x_train_reduction = pca.transform(x_train) # 对数据降维处理
x_test_reduction = pca.transform(x_test)
# 降噪处理过程
X_reduction = pca.transform(X) # 1. 先降维
X_restore = pca.inverse_transform(X_reduction) # 2. 再恢复维度
多项式回归
- 线性回归:y = a*x + b
- 多项式回归: y = a * x^2 + b*x + c
from sklearn.preprocessing import PolynomialFeatures # 多回归线性参数设置
poly = PolynomialFeatures( degree=2 ) # 2次系数
poly.fit(x)
x2 = poly.transform(x) # 对训练样本2次化
from sklearn.linear_model import LinearRegression # 多项式回归仍然是线性回归
lin_reg = LinearRegression()
lin_reg.fit(x2, y) # 对处理后的样本使用二次回归方程
y_predict = lin_reg.predict(x2)
lin_reg.coef_ # 回归方程的系数
lin_reg.intercept_ # 方程的截距
# 显示多项式的方程曲线
plt.scatter(x_row,y)
plt.plot(np.sort(x_row), y_predict[np.argsort(x_row)], color='r')
plt.show()
- 对于
degree
参数的设置会影响矩阵的扩展
x = np.arange(1,11).reshape(-1,2)
x # x have two columns x1, x2
poly2 = PolynomialFeatures(degree=2)
poly2.fit(x)
x2 = poly2.transform(x) # after transform x2 add three columns
x2 # x1**2 , x1*x2, x2**2
poly3 = PolynomialFeatures(degree=3) # (x1 + x2) ^ 3
poly3.fit(x)
x3 = poly3.transform(x) # x1**3,x2**3, x1*x2**2, x2*x1**2, x1**2,x2**2
x3 # add 7 columns
管道连接多个方法
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
poly_reg = Pipeline([ # 使用管道连接多个方法
('poly', PolynomialFeatures(degree=2)),
('std_scaler', StandardScaler()),
('lin_reg', LinearRegression())
])
poly_reg.fit(x, y) # 直接对管道实例化后的对象训练和预测计算
y_predict = poly_reg.predict(x)
poly_reg.score(x_test)
过拟合和欠拟合
测试数据集的意义: 寻找测试数据集最佳的点,泛化能力最好的地方
学习曲线
交叉验证Cross Validation
CV验证,对训练数据集划分多个等块,分别取某一块为验证数据集,避免一块测试数据集的不准确,取验证数据集验证结果最好的一个。
留一法LOO—CV:将训练数据集分成m份,留一份训练
leave-one-out cross validation
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score # 1.通过交叉验证方法验证
knn_clf = KNeighborsClassifier()
cross_val_score(knn_clf, x_train, y_train, cv=10)
from sklearn.model_selection import GridSearchCV # 2. 使用网格搜索交叉验证
parame = [
{
'weights': ['distance'],
'n_neighbors':[i for i in range(2,10)],
'p':[i for i in range(1,6)]
}
]
gridsearchcv = GridSearchCV(knn_clf, parame, verbose=1, cv=5) # cv参数代表交叉验证的折数,
gridsearchcv.fit(x_train, y_train)
gridsearchcv.best_params_ # 使用交叉验证取得的最佳参数
gridsearchcv.best_score_ # 使用交叉验证取得的最佳结果
偏差bias & 方差variance
偏差:偏离目标值得位置
方差:离散的程度
模型误差:偏差+方差+不可避免的误差
偏差:
对问题的假设不正确:非线性使用回归线性预测
欠拟合:
参数学习通常为高偏差,线性回归天生的高偏差,假设的影响很大
方差:
过拟合:对模型过于复杂,如使用高阶方程模拟回归,degree过大
非参数学习通常为高方差, KNN天生的高方差,不对数据进行假设
偏差和方差通常是矛盾的。低偏差高方差,低方差高偏差
机器学习主要问题来自于 方差
解决手段:
- 降低模型复杂度
- 降维降噪
- 增加样本数
- 使用验证集
- 模型的正则化
模型泛化:岭回归& lasso回归& 弹性网Elastic Net
多项式回归过拟合的情况,有一些系数会很大,模型正则化就是限制其不要太大
LASSO更倾向于直线,Ridge更倾向于曲线,
LASSO对应的theta有的为零,Selection Operator对应的特征无用
# Ridge ||y - Xw||^2_2 + alpha * ||w||^2_2
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0) # 岭回归的实例化及参数设置
ridge.fit(x_train,y_train)
y_predict = ridge.predict(x_test)
result = ridge.score(x_test, y_test)
# LASSO (1 / (2 * n_samples)) * ||y - Xw||^2_2 + alpha * ||w||_1
from sklearn.linear_model import Lasso