<机器学习笔记-02> 线性回归

<机器学习笔记-02> (scikit-learn 02)线性回归


摘要:本文是“Mastering Machine Learning With scikit-learn”第二章“线性回归”的学习笔记,对书中源码进行实现,并对书中内容按照知识模块进行整理,尤其是对python函数整理力求做到清晰有条理;

注1:笔记中重在功能实现,对于基本理论理解不深,以后还是需要加强的。

注2:本文第一次使用Pypora软件写成md文件,然后上传到MarkDown页面,在序号排版方面比CSDN自带的要好些,但是快捷键不如CSDN博客方便,而数学公式和图片上传还都不太熟悉;


  1. 知识要点总结:

    1. 基本概念:
      1. 掌握模型:一元/多元线性回归模型,一元多项式回归模型;
      2. 理解概念:损失函数、残差;
      3. 理解回归拟合模型参数估计,尤其是最小二乘法;理解正则化的常用方法(岭回归法,LASSO法,弹性网);
      4. 理解预测结果的方法,尤其是R-Square;
      5. 理解梯度下降法;
    2. Python基本功能:
      1. 读入库/库中的某个函数,或为其取别名;
      2. 掌握terminal输入多行命令的方法;
      3. 使用def定义函数
      4. 使用print函数输出文本和数字;
      5. 掌握for循环使用
      6. 掌握用enumerate()获取列表的索引和数值
      7. 会用shape()和reshape()对Array的形状进行操作;
      8. 掌握list的索引号调用方法;
    3. Matplotlib库
      1. 打开Inline显示图片功能;
      2. 定义显示图片的文字(大小+字体)、题目、坐标轴(名称+范围)、打开网格;
      3. 绘制不同颜色的点、线;
      4. 绘制散点分布图;
    4. Numpy库
      1. 会求均值、方差、协方差;
      2. 会求矩阵的dot,inv,transpose();
      3. 使用lstsq()求最小二乘法;
    5. Sklearn库
      1. 会基于linear_model.LinearRegression建立一元/多元线性回归模型;会基于LinearRegression和preprocessing.PolynomialFeatures建立一元多次线性回归模型;会基于linear_model.SGDRegressor建立随机梯度下降SGD模型;
      2. 使用model.fit()建模,使用model.predict()预测,使用model.score()求测试集的R-Square;
      3. 基于cross_validation,会用train_test_split()函数划分训练集和测试集,会用cross_val_score()计算交叉检验的R-Squre结果;
  2. 基本概念与理论分析

    1. 损失函数(loss function):用来定义模型与观测值的误差;
    2. 残差(residuals):模型预测的数值与训练集数据的差异,也叫训练误差(training erros);
    3. LinearRegression类fit()学习方法下的
      1. 一元线性回归模型为: y=a+bx
      2. 多元线性回归模型为: y=a+b1x1+b2x2+...+bnxn
    4. 回归拟合模型的参数估计常用方法是普通最小二乘法;对于一元线性回归的最小二乘法,相关系数 b 可以通过方差和协方差求得;
    5. R方(R-Square):确定系数(coefficent of determination),表示模型对现实数据拟合的程度;可以通过样本总体平方和以及残差平方和可以求得;
    6. 多元线性回归 & 多项式回归
    7. 正则化方法
      1. 岭回归(Ridge Regression,RR):增加L2范数项(相关系数向量平方和的平方根)来调整成本函数(残差平方和)
      2. 最小收缩和选择算子(LASSO),增加L1范数项(相关系数向量之和)来调整成本函数;
      3. 弹性网(elastic net)正则化方法:线性组合L1和L2范数项;
    8. 梯度下降法拟合:
      1. 每一次运算时,计算对应位置的导数,然后沿着梯度(变化最快的方向)相反的方向前进,总是垂直于等高线;
      2. 梯度下降法求出的是成本函数的局部最小值;一个三维凸(convex)函数所有点构成的图形像一个碗;残差平方和构成的成本函数是凸函数,所以可以找到全局最小值;
      3. 重要超参数是步长(learning rate),用来控制下降幅度;
      4. 分类:批量梯度下降(每次迭代用所有训练样本),随机梯度下降(SGD,每次迭代用随机选择的训练样本)
  3. 编程积累

    1. 本笔记使用PyQt(qtconsole)IDE;
    2. 基本用法
      1. 缩进代表逻辑层次,代替C++中的大括号{};
      2. 注释:单行使用#,多行使用”“” “”“;
      3. terminal情况下输入多行命令:要使用\;注意
        plt1=runplt(); \
        X=[[6],[8],[10],[14],[18]] ;\
        Y=[[7],[9],[13],[17.5],[18]]; \
        plt1.plot(X,Y,'k.'); \
        plt1.show()
      4. 定义函数def
        def runplt():
        plt.figure()
        return plt
      5. 打印命令 print(),以及字符串%使用(一个是取余数,一个是将数字转化为字符串); .2f表示字符串格式为
        print ('预测一张13寸披萨的价格:$%.2f'%model.predict([13])[0])
      6. %s-string,%d-整数ints
        "Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".
        "My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
      7. 使用enumerate()循环,得到数组的序号idx(放在前面的)和数值val(放在后面的);
        for idx, val in enumerate(ints):
         print(idx, val)
      8. linspace()将区间进行划分
        xx = np.linspace(0, 26, 100)
        xx #输出: array([  0. ,   6.5,  13. ,  19.5,  26. ])
      9. Y的shape如果是(n,m),array.shape[0]返回n;reshape()将对array的形状进行改变;
        In [46]: Y = np.arange(12).reshape(3,4)
        
        In [47]: Y
        Out[47]: 
        array([[ 0,  1,  2,  3],
            [ 4,  5,  6,  7],
            [ 8,  9, 10, 11]])
        
        In [48]: Y.shape
        Out[48]: (3, 4)
        
        In [49]: Y.shape[0]
        Out[49]: 3
      10. list索引号
        >>> a = [1,2,3,4,5,6]
        >>> a[:-1]    #输出[1, 2, 3, 4, 5]
        >>> a[1:2]  #输出[2]
        >>> a[1:]   #输出[2, 3, 4, 5, 6]
        >>> a[1:]   #输出[1, 2, 3, 4, 5, 6]
    3. matplotlib画图工具集合
      1. 开启plot inline模式:绘制的图将像其他计算结果一样,直接显示在terminal上面;
        %matplotlib inline
      2. 读入工具包matplotlib;import library as lib
        import matplotlib.pyplot as plt
      3. 字体定义:两种字体定义的方法
        
        #方法1
        
        from matplotlib.font_manager import FontProperties
        font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
        
        
        #方法2
        
        font2={'fontname':'Helvetica'} 
        matplotlib.pyplot.title('匹萨价格与直径数据',font2)#标题(名称+字体)定义
      4. 2-D绘图、标题、坐标轴定义(名称+范围)、显示网格
        matplotlib.pyplot.figure()#新建绘图板
        matplotlib.pyplot.title('匹萨价格与直径数据',fontproperties=font)#标题(名称+字体)定义
        matplotlib.pyplot.xlabel('直径(英寸)',fontproperties=font)#X轴(名称+字体)定义
        matplotlib.pyplot.ylabel('价格(美元)',font2)#Y轴(名称+字体)定义
        matplotlib.pyplot.axis([0, 25, 0, 25]) #定义坐标轴的范围
        matplotlib.pyplot.grid(True)#显示网格
      5. 绘制坐标点,显示绘图结果;注意绘图时输入的坐标应该为二维数组2-D Array
        X = [[6], [8], [10], [14], [18]]
        y = [[7], [9], [13], [17.5], [18]]
        matplotlib.pyplot.plot(X, y, 'k.')
        matplotlib.pyplot.plot.show()
      6. 绘制类型:线色+类型(点或者线)
        plt.plot(X, y, 'k.') #绘制黑色(k)点(.)
        plt.plot(X2, y2, 'g-') #绘制绿色(g)线(-)
        plt.plot(X2, y4, 'y-.')#绘制黄色(y)点划线(-.)
      7. 实际使用绘图工具时,可以先定义一个基本的函数模板,里面包括标题、坐标轴定义、字体等基本设置,然后再调用该模板,在该模板上进行适当地修改即可;
      8. scatter(,)绘制散点分布图
        plt.scatter(df['alcohol'], df['quality']) 
    4. Numpy命令积累
      1. 调用Numpy库
        import numpy as np
      2. mean()求均值
        print('残差平均值: %.2f' % np.mean((model.predict(X) - y) ** 2))
      3. var()求方差
        print(np.var([6, 8, 10, 14, 18], ddof=1)) #numpy.var()可以直接计算方差
      4. cov()求协方差
        print(np.cov([6, 8, 10, 14, 18], [7, 9, 13, 17.5, 18])[0][1]) #numpy.cov()计算协方差
      5. 矩阵计算-求逆inv,点乘dot,转置transpose
        from numpy.linalg import inv
        from numpy import dot, transpose
        X = [[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]]
        y = [[7], [9], [13], [17.5], [18]]
        print(dot(inv(dot(transpose(X), X)), dot(transpose(X), y)))
      6. 最小二乘法lstsq()
        from numpy.linalg import lstsqprint(lstsq(X, y)[0])
    5. Sklearn命令积累
      1. 调入线性回归函数LinearRegression;
        from sklearn.linear_model import LinearRegression
      2. fit()建立一元线性回归模型
        X = [[8], [9], [11], [16], [12]]
        y = [[11], [8.5], [15], [18], [11]]
        model = LinearRegression() 
        model.fit(X, y)#建立一元线性回归模型
      3. fit()建立多元线性回归模型
        X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]]
        y = [[7], [9], [13], [17.5], [18]]
        model = LinearRegression()
        model.fit(X, y) #建立二元线性回归模型
      4. predict()通过fit()算出的模型参数构成的模型,对解释变量进行预测获得的值;
        print('预测一张12英寸匹萨价格:$%.2f' % model.predict([12])[0]) #单值预测
        
        X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
        predictions = model.predict(X_test)#一组数进行预测
      5. mode.score计算R方R-Square
        model.score(X_test, y_test) #LinearRegression的score方法可以计算R方
      6. 建立一元多项式回归模型
        from sklearn.linear_model import LinearRegression
        from sklearn.preprocessing import PolynomialFeatures 
        
        X_train = [[6], [8], [10], [14], [18]]
        y_train = [[7], [9], [13], [17.5], [18]] #需要输入列向量,而不是行向量
        X_test = [[6], [8], [11], [16]]#测试数据准备
        y_test = [[8], [12], [15], [18]]
        
        quadratic_featurizer = PolynomialFeatures(degree=2) #定义多项式的最高阶数
        X_train_quadratic = quadratic_featurizer.fit_transform(X_train) #为fit()建模准备输入
        regressor_quadratic = LinearRegression() 
        regressor_quadratic.fit(X_train_quadratic, y_train)# fit()函数建模
        
        X_test_quadratic = quadratic_featurizer.transform(X_test) #为预测准备输入量
        y_test_quadratic=regressor_quadratic.predict(xx_quadratic) #使用模型预测数据
        
        print('一元线性回归 r-squared', regressor.score(X_test, y_test)) #计算R-Square
      7. train_test_split()按数据集分成训练集和测试集;分区比例可以设置,默认25%分给测试集;
        from sklearn.cross_validation import train_test_split
        df = pd.read_csv('mlslpic/winequality-red.csv', sep=';')
        X = df[list(df.columns)[:-1]]
        y = df['quality']
        X_train, X_test, y_train, y_test = train_test_split(X, y)
      8. cross_val_score()可以返回交叉检验的score结果;
        from sklearn.cross_validation import cross_val_score
        regressor = LinearRegression()
        scores = cross_val_score(regressor, X, y, cv=5)
        print(scores.mean(), scores
      9. 加载scikit-learn数据集
        from sklearn.datasets import load_boston
      10. 加载SGDRegressor,归一化StandardScaler,建立模型以及求R-Square
        from sklearn.linear_model import SGDRegressor
        from sklearn.preprocessing import StandardScaler
        X_scaler = StandardScaler()
        y_scaler = StandardScaler()
        
        X_train = X_scaler.fit_transform(X_train)
        y_train = y_scaler.fit_transform(y_train)
        X_test = X_scaler.transform(X_test)
        y_test = y_scaler.transform(y_test)
        
        regressor = SGDRegressor(loss='squared_loss')
        regressor.fit_transform(X_train, y_train) #建立模型
        
        print('测试集R方值:', regressor.score(X_test, y_test))

    6. pandas库
      1. 读入pandas库;可以处理二维表
        import pandas as pd
      2. read_csv读入csv文件,sep分隔符
        df=pd.read_csv('C:/add.csv',sep=';')
      3. head()显示数据的前几行、前几列
        df.head()
      4. describe()显示统计结果
        df.describe()
      5. [' ']显示统计结果
        df['alcohol']

你可能感兴趣的:(机器学习,machine,learning,python,机器学习,线性回归,Regression,scikit)