sklearn_线性回归

回归问题的判定
    目标值为连续性的值(小数)
期末成绩= 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折交叉验证
                        网格搜索:每个参数都会查看效果,选择最好的参数
             

你可能感兴趣的:(sklearn_线性回归)