机器学习笔记三
机器学习算法
回归算法分析
- 分类和回归问题区别
- 回归
- 目标值连续
- 分类
- 离散型数据
- 回归
- 回归应用
- 房价预测
- 销售额的预测
- 贷款额度预测
- 线性回归
-
寻找一种能够预测的趋势
-
线性关系
- 二维:直线关系
- 三维:特征和目标值,在一个平面当中
-
线性关系定义
- 一个特征
- y = kx +b
- b : 偏置
- 为了使对单个特征的情况更加通用
- 多个特征
- y = W1* X1 + W2*X2 + … + WaXa + b
- W:权重
- b: 偏置项
- y = W1* X1 + W2*X2 + … + WaXa + b
- 一个特征
-
线性回归定义:特征和目标值之间进行建模的回归分析
-
矩阵
-
矩阵: 大多数算法的计算基础
-
数组和矩阵的区别
- 数组:
- 可以是0维 1维 2维 3维 等
- 数组运算
- 加减乘除
- 矩阵
- 必须是2维的
- 满足了一些的特定的运算需求
- 数组:
-
矩阵运算
- 矩阵相乘
- (m行,l列)*(l行,n列) = (m行,n列)
- np.dot()
In [2]: import numpy as np In [3]: a = [[1,2,3,4,],[2,3,7,9]] In [4]: b = [2,2,2,2] In [6]: np.multiply(a,b) # 数组运算 Out[6]: array([[ 2, 4, 6, 8], [ 4, 6, 14, 18]]) In [7]: b = [[2],[2],[2],[2]] In [8]: np.dot(a,b) Out[8]: array([[20], [42]])
- 矩阵相乘
线性回归(迭代的算法)
-
回归
- 知道误差,就去不断减少误差
-
迭代的过程
- 算法
- 策略(损失函数)
- 优化
-
策略(损失函数)
- 最小二乘法
- 所有 的(预测值 - 实际值)^2 的和就是误差
- 误差平方和
-
优化
- 寻找最优的W值
- 使得损失函数最小
- 求W的方法
- 正规方程
- 数据复杂的时候很难求到
- 梯度下降
- 影响因素: 学习率
- 正规方程
-
API
- 正规方程
sklearn.linear_model.LinearRegression
- 回归系数(权重)
coef_
- 普通最小二乘线性回归
- 回归系数(权重)
- 梯度下降
sklearn.linear_model.SGDRegressor
coef_
- 通过使用SGD最小化线性模型
- 容易出现过拟合
- 使用正则化
- 岭回归
- 使用正则化
- 正规方程
-
scikit-learn的优缺点
- 优点
- 封装好,建立模型简单,预测简单
- 缺点
- 算法的过程,有写参数都字啊算法API内部优化,参数难找
- tensorflow:
- 封装高低,自己实现线性回归,学习率什么的都可以自己指定,过程可以看到
- 优点
-
线性回归需要做标准化处理
-
正规方程和梯度下降对比
- 梯度下降
- 需要学习率
- 需要多次迭代
- 适用于特征量大的实例
- 适用于各种类型的模型
- 正规方程
- 不需要学习率
- 一次运算得出结果
- 特征量少的时候用的多,一般特征小于10000时使用
- 一般只用在特征量少的线性模型
- 不能解决你和问题
- 梯度下降
回归性能评估
- 使用均方误差
- API
sklearn.metrics.mean_squared_error
- 参数
- 测试数据预测的目标值
- 测试数据实际的目标值
- 参数
过拟合和欠拟合
-
问题
- 训练数据训练的很好,但是在测试数据中不是很好
-
过拟合
- 学习的东西太多
- 训练集比较好,测试集不好
- 模型过于复杂
- 原因
- 原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型兼顾各个测试数据点
- 解决办法
- 特征选择,消除关联大的特征(比较难)
- 交叉验证(让所有数据都有过训练) - 检验出
- 正则化(了解)
- 尽量减少高次项的权重
- 岭回归-带有正则化
-
欠拟合
- 学习的东西太少
- 训练集和测试集数据误差都大
- 模型过于简单
- 原因
- 学习数据的特征过少
- 解决方法
- 增加数据的特征数量
-
模型复杂的原因
- 原因:
- 数据的特征和目标值之间不仅仅是线性关系
- 原因:
-
判断方法
- 看交叉验证训练集的结果和测试集的结果
- 欠拟合
- 训练集结果和测试集结果都不行
- 过拟合
- 训练集结果很好,测试集下降幅度大
-
回归解决过拟合
- L2正则化: Ridge:岭回归,带有正则化的线性回归
岭回归
- 带有正则化的回归
- 解决过拟合
- API
sklearn.linear_model.Ridge(alpha=1.0)
- 参数
- alpha: 正则化力度(超参数)
- 取值范围 0-1之间/1-10之间
- coef_: 回归系数
- alpha: 正则化力度(超参数)
- 参数
- 正则化力度对结果的影响
- 力度越来越大,权重越来越小,模型越来越简单
- 优势
- 回归更符合实际,更可靠
- 在异常数据较多的时候使用岭回归
- alpha超参数可以使用网格搜索来进行对数据的优化
模型的保存和加载
- 将训练好的模型储存起来,再后在直接加载使用
- 模块
from sklearn.externals import joblib
- 0.8版本
- 最新版本中直接导入joblib使用
import joblib
- 保存
- joblib.dump(实例化的模型,“文件名.pkl”)
- 加载
- joblib.load(“文件名.pkl”)
回归算法实例
- 线性回归:正规方程、梯度下降、岭回归、模型保存和加载
波士顿房价预测# coding=utf-8 # 回归数据集 波士顿房价 from sklearn.datasets import load_boston # 标准化处理 from sklearn.preprocessing import StandardScaler # 线性回归 正规方程 梯度下降 岭回归 from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge # 数据分隔 from sklearn.model_selection import train_test_split # 算法衡量 均方误差 from sklearn.metrics import mean_squared_error # 导入保存模型 import joblib def linear_regression(x_train, x_test, y_train, y_test, std_y): """ 正规方程 :param x_train: :param x_test: :param y_train: :param y_test: :return:None """ print("正规方程") # 实例化 lr = LinearRegression() # 输入数据 lr.fit(x_train, y_train) # 权重 print("回归系数:") print(lr.coef_) # 预测 测试集的房子价格 # 标准化转换成真实的房子的价格 inverse_transform y_predict = std_y.inverse_transform(lr.predict(x_test)) print("测试集中的预测房价:\n", y_predict) print("均方误差:"