天天看點

<機器學習筆記-02> <scikit-learn -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 <script type="math/tex" id="MathJax-Element-6">b</script> 可以通過方差和協方差求得;
    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=[[],[],[],[],[]] ;\
        Y=[[],[],[],[],[]]; \
        plt1.plot(X,Y,'k.'); \
        plt1.show()
                   
      4. 定義函數def
        def runplt():
        plt.figure()
        return plt
                   
      5. 列印指令

        print()

        ,以及字元串%使用(一個是取餘數,一個是将數字轉化為字元串); .2f表示字元串格式為
        print ('預測一張13寸披薩的價格:$%.2f'%model.predict([])[])
                   
      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', ) #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(, , )
        xx #輸出: array([  0. ,   6.5,  13. ,  19.5,  26. ])
                   
      9. Y的shape如果是(n,m),array.shape[0]傳回n;reshape()将對array的形狀進行改變;
        In []: Y = np.arange().reshape(,)
        
        In []: Y
        Out[]: 
        array([[ ,  ,  ,  ],
            [ ,  ,  ,  ],
            [ ,  , , ]])
        
        In []: Y.shape
        Out[]: (, )
        
        In []: Y.shape[]
        Out[]: 
                   
      10. list索引号
        >>> a = [,,,,,]
        >>> a[:-]    #輸出[1, 2, 3, 4, 5]
        >>> a[:]  #輸出[2]
        >>> a[:]   #輸出[2, 3, 4, 5, 6]
        >>> a[:]   #輸出[1, 2, 3, 4, 5, 6]
                   
    3. matplotlib畫圖工具集合
      1. 開啟plot inline模式:繪制的圖将像其他計算結果一樣,直接顯示在terminal上面;
        %matplotlib inline
                   
      2. 讀入工具包matplotlib;import library as lib
      3. 字型定義:兩種字型定義的方法
        #方法1
        
        from matplotlib.font_manager import FontProperties
        font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=)
        
        
        #方法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([, , , ]) #定義坐标軸的範圍
        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庫
      2. mean()求均值
        print('殘差平均值: %.2f' % np.mean((model.predict(X) - y) ** ))
                   
      3. 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)[])
                   
    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([])[]) #單值預測
        
        X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
        predictions = model.predict(X_test)#一組數進行預測
                   
      5. mode.score計算R方R-Square
      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=) #定義多項式的最高階數
        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)[:-]]
        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=)
        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庫;可以處理二維表
      2. read_csv

        讀入csv檔案,

        sep

        分隔符
        df=pd.read_csv('C:/add.csv',sep=';')
                   
      3. head()

        顯示資料的前幾行、前幾列
        df.head()
                   
      4. describe()

        顯示統計結果
        df.describe()
                   
      5. [' ']

        顯示統計結果
        df['alcohol']