回归问题的判定
目标值为连续性的值(小数)
期末成绩= 0.7*考试成绩+0.3*平时成绩
西瓜好坏 = 0.2*色泽+0.5*根 + 0.3*敲声 z这是分类问题
找关系。找到特征和最终结果的关系程度找到权重
y =kx+b
+b 是一种偏置。是为了当特征只有一个时也能通用
多个特征: k1*房子面积+k2房子面积 + b
多个特征: w1房屋面积+w2房屋面积+ 。。。+b
w表示每个特征的权重。b表示偏置项,可以理解为w0x1
什么是线性回归:
通过一个或多个自变量与因变量之间进行建模的回归分析,其中可以为一个或多个自变量之间的线性组合
一元线性回归: 涉及到的自变量只有一个
多元线性回归: 涉及到的自变量有多个
通用公式:h(w) = w0 +w1*x1+w2*x2+w3*x3+.....
其中w,x为矩阵: w = [w0,w1,w2...] x = [1,x1,x2....]
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.scatter([60,72,75,80,83,87,90,93],[126,151.2,157.5,168,174.3,180,192.2,194],label = "散点图")
plt.legend()
plt.grid() #线图
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.show()
回归:知道有误差,并且不断减少误差
减少误差的方法:
损失函数(误差大小),xuzh寻找最优化的w值:又称最小二乘法 a(x1,y1), b(x2,y2)。。。
最小二乘法之正规方程:不需要掌握
最小二乘法之梯度下降:梯度下降学习率
迭代算法
预测的时候会有误差
scikit_learn:优点 封装好,简历模型简单,预测简单
缺点:算法的过程,有些参数都在算法API内部优化
当数据量达到几十万几百万几千万的时候直接使用梯度下降SGDRegressor()
其他时候使用正规方式求解LinearRegression()
评估方式:
均方误差求解: (预测值-实际值)**2 之和最小,就是最佳结果
官网推荐:
样本小于100k,lr LinearRegression() 正式方程求解或者其他方法
样本>=100k ,选择sgd SGDRegressor() 梯度下降
梯度下降 正式方程求解
需要选择学习率 不需要
需要多次迭代 一次运算得出
当特征数量n大的 数据越大,计算越代价大
时候较好的使用
适用于各种模型 只适用于线性模型,不适用逻辑回归和其他模型
LinearRegreesion 与SGDRegressor 评估
1、特点:
线性回归最为简单,易用的模型。
小规模数据: LinearRegression (不能解决过拟合问题)以及其他问题
大规模数据:SGDRegressor
问题:训练集训练的很好,误差也不大。为什么在测试集就有问题?
1、什么是过拟合,什么是欠拟合
过拟合:在训练集上能得到很好地效果,但是在训练集以外的数据集上不能很好地你拟合。此时认为出现了 过拟合的现象(模型过于复杂)
欠拟合:在训练集上不能很好地拟合数据,但是在训练集以外的数据集上也不能很好地拟合,此时认为出现了 欠拟合现象(模型过于简单)
2、过拟合解决方法
原因:原始特征过多,模型过于复杂是因为模型尝试兼顾各个特征
解决方法:进行特征选择,消除关联性较大的数据(很难做) feature_selection 过滤式:低方差特征 嵌入式:正则化,决策树,神经网络
交叉验证(让所有的数据都进行过训练) 看误差
正则化(了解)
L2正则化:Ridge:岭回归 带有正则化的线性回归 解决过拟合 sklearn.liner_model.Ridge(alpha = 1.0) 具有l2正则化的线性最小二乘法
alpha:正则化力度。coef_:回归系数
岭回归:回归得到的回归系数更符合实际,更可靠
from sklearn import datasets
from sklearn.linear_model import LinearRegression #最小二乘法之正规方程
from sklearn.linear_model import SGDRegressor #最小二乘法之梯度下降
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler #标准化API
from sklearn.metrics import mean_squared_error #均方误差报告
from sklearn.linear_model import Ridge #自带L2正则化的线性回归
from sklearn.externals import joblib #保存模型并加载
def myliner():
"""
线性回归预测房子价格
"""
#获取数据
lb = datasets.load_boston()
#分割数据集
x_train,x_test,y_train,y_test = train_test_split(lb.data,lb.target,test_size =0.25)
# print(y_train,y_test)
#进行标准化 (要不要对目标值进行处理) 回归需要对特征值和目标值都有进行转换实例化两个标准化API
#训练集
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
#目标值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1,1))
y_test = std_y.transform(y_test.reshape(-1,1))
#estimator 预测
#正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_) #最好的w值
#保存训练好的模型
joblib.dump(lr,"./tmp/test.pkl")
#加载模型
joblib.load("./tmp/test.pkl")
#加载模型后就不需要再次的训练模型,就可以直接调用
#预测测试集的房子价格
y_lr_predict = lr.predict(x_test)
# print("每个房子的y预测值",y_lr_predict)
y_lr_predict_inverse = std_y.inverse_transform(y_lr_predict) #inverse_transform()将转换的数据在转换回去
# print("真实值",y_lr_predict_inverse)
print("正规方程均方误差",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict_inverse))
print("="*50)
#通过梯度下降预测房价
sg = SGDRegressor()
sg.fit(x_train,y_train)
print(sg.coef_) #最好的w值
#预测测试集的房子价格
y_sg_predict = sg.predict(x_test)
# print("每个房子的y预测值",y_sg_predict)
y_sg_predict_inverse = std_y.inverse_transform(y_sg_predict) #inverse_transform()将转换的数据在转换回去
# print("真实值",y_sg_predict_inverse)
print("梯度下降均方误差",mean_squared_error(std_y.inverse_transform(y_test),y_sg_predict_inverse))
print("="*50)
#使用岭回归预测房价
rd = Ridge(alpha = 1.0)
rd.fit(x_train,y_train)
print(rd.coef_)
#预测测试集的房子价格
y_rd_predict = rd.predict(x_test)
# print("每个房子的y预测值",y_rd_predict)
y_rd_predict_inverse = std_y.inverse_transform(y_rd_predict) #inverse_transform()将转换的数据在转换回去
# print("真实值",y_sg_predict_inverse)
print("岭回归均方误差",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict_inverse))
return None
if __name__ =="__main__":
myliner()
# 正规方程均方误差 25.1462609765
# 梯度下降均方误差 26.4288893128 误差越小越好,由此可以发现要根据实际情况选择合适的方式
#总结
数据集的划分:
训练集和测试集
转换器和估计器:
转换器:实例化
fit_transform()
fit()
transform()
估计器:实现了一类算法的API
流程:fit训练数据,predict()预测测试集的结果
score:得出准确率
分类算法:
目标是离散型
k-紧邻: 距离公式 欧式距离 开根((x1-x)**2 + (y1-y)**2)
优点:简单理解,易于实现
缺点:K取值问题, 性能问题。 不适合用在大数据数据集上
超参数:K
数据的处理:标准化
朴素贝叶斯: 概率基础 条件概率和联合概率
朴素:条件独立。 才能叫朴素贝叶斯
贝叶斯公式:联合概率
优点:主要在文本分类上准确率比较高
缺点:条件必须独立,历史数据的准确性
数据处理: 文本的特征抽取
决策树:信息论
信息熵: H(D) = 9/15*log(9/15) + 6/15*log(6/15) H(D|年龄) = H(D) - H(年龄) = H(D) -[1/3*2/5log(2/5)+...]
信息增益
信息熵是和不确定性相关的
基尼系数(sklearn 默认的,因为效果比较好)
优点: 准确率很高, 适用于各种数据,可解释性高
缺点:容易过拟合,树建立的太深
随机森林: 集成学习方法,多个同样的分类器组成
建立过程:1、在n个样本中选择若干样本,重复n次
2、在M个特征中选择m个样本,并放入重新抽取
优点: 准确率高, 不会过拟合,对大数据集实用
超参数:树的深度,多少课树
分类算法的评估:
准确率
精确率和召回率 混淆矩阵,每个类别都有
模型调参数:交叉验证 : 为了使每个数据都有过训练和验证 训练集和验证集 统称为训练集 K折交叉验证
网格搜索:每个参数都会查看效果,选择最好的参数