1. 程式人生 > >機器學習 迴歸分析(regression analysis)

機器學習 迴歸分析(regression analysis)

____tz_zs學習筆記

監督學習(Supervised Learning)

監督學習中,如果預測的變數是離散的,我們稱其為分類(如決策樹,支援向量機等),如果預測的變數是連續的,我們稱其為迴歸。

迴歸(Regression):Y變數為連續數值型(continuous numerical variable)
如:房價,人數,降雨量
分類(Classification): Y變數為類別型(categorical variable)
如:顏色類別,電腦品牌,有無信譽

迴歸分析(regression analysis)

建立方程模擬兩個或者多個變數之間的關係的過程

被預測的變數叫做:因變數(dependent variable), y, 輸出(output)
被用來進行預測的變數叫做: 自變數(independent variable), x, 輸入(input)

在統計學中,迴歸分析(regression analysis)是確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法。運用十分廣泛,迴歸分析按照涉及的變數的多少,分為一元迴歸和多元迴歸分析;按照自變數(百度百科 中這裡寫的因變數,個人覺得應該是自變數)的多少,可分為簡單迴歸分析和多重回歸分析;按照自變數和因變數之間的關係型別,可分為線性迴歸分析和非線性迴歸分析。如果在迴歸分析中,只包括一個自變數和一個因變數,且二者的關係可用一條直線近似表示,這種迴歸分析稱為一元線性迴歸分析。如果迴歸分析中包括兩個或兩個以上的自變數,且自變數之間存線上性相關,則稱為多重線性迴歸分析。在大資料分析中,迴歸分析是一種預測性的建模技術,它研究的是因變數(目標)和自變數(預測器)之間的關係。這種技術通常用於預測分析,時間序列模型以及發現變數之間的因果關係。例如,司機的魯莽駕駛與道路交通事故數量之間的關係,最好的研究方法就是迴歸。

提醒:發現很多中文資料裡,多元迴歸、多重回歸等的概念及英文單詞的對應均有錯漏,根據維基百科及一些英文論文,歸納如下:

一般線性模型(General linear model)/多元迴歸(multivariate regression) 多個自變數,多個因變數,是多重線性迴歸(Multiple linear regression)的推廣。

多重線性迴歸(Multiple linear regression)是線性迴歸(linear regression )的推廣(多個自變數),是(general linear models)的特例(一個因變數)。

當多元迴歸模型(multivariate regression model)中有多個預測變數(predictor variable)時,模型為多元多重回歸(multivariate multiple regression)。

迴歸方程(regression equation)

迴歸方程(regression equation)是根據樣本資料通過迴歸分析所得到的反映一個變數(因變數)對另一個或一組變數(自變數)的迴歸關係的數學表示式。迴歸直線方程用得比較多,可以用最小二乘法求迴歸直線方程中的a,b,從而得到迴歸直線方程。【所屬型別:數學】

簡單線性迴歸(Simple Linear Regression)

簡單線性迴歸包含一個自變數(x)和一個因變數(y),兩個變數的關係用一條直線來模擬。

簡單線性迴歸模型

被用來描述因變數(y)和自變數(X)以及偏差(error)之間關係的方程叫做迴歸模型

簡單線性迴歸的模型是:

              
          其中:β0、β1為引數,ε 為偏差

簡單線性迴歸方程

                         E(y) = β0+β1x 
         這個方程對應的影象是一條直線,稱作迴歸線
         其中,β0是迴歸線的截距
                  β1是迴歸線的斜率  
                  E(y)是在一個給定x值下y的期望值(均值)


估計的簡單線性迴歸方程

          ŷ=b0+b1x
     這個方程叫做估計線性方程(estimated regression line)
     其中,b0是估計線性方程的縱截距
           b1是估計線性方程的斜率
           ŷ是在自變數x等於一個給定值的時候,y的估計值


計算公式:

邏輯的程式碼實現

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np

# 傳入資料,返回b0,b1的估計值
def fitSLR(x, y):
    n = len(x)
    dinominator = 0 #分母
    numerator = 0   # 分子
    for i in range(0, n):
        numerator += (x[i] - np.mean(x))*(y[i] - np.mean(y))
        dinominator += (x[i] - np.mean(x))**2
    
    print("numerator:"+str(numerator))
    print("dinominator:"+str(dinominator))
    
    b1 = numerator/float(dinominator)
    b0 = np.mean(y)/float(np.mean(x))
    
    return b0, b1


def predict(x, b0, b1):
    return b0 + x*b1


x = [1, 3, 2, 1, 3]
y = [14, 24, 18, 17, 27]    




b0, b1 = fitSLR(x, y)


print "intercept:", b0, " slope:", b1


x_test = 6


y_test = predict(6, b0, b1)


print "y_test:", y_test

執行結果:

numerator:20.0
dinominator:4.0
intercept: 10.0  slope: 5.0
y_test: 40.0

多重線性迴歸(Multiple linear regression,MLR)

多重線性迴歸(multiple linear regression) 是簡單直線迴歸的推廣,研究一個因變數與多個自變數之間的數量依存關係。多重線性迴歸用迴歸方程描述一個因變數與多個自變數的依存關係,簡稱多重回歸。

多重迴歸模型
     y=β0+β1x1+β2x2+ ... +βpxp+ε
    其中:β0,β1,β2... βp是引數
          ε是誤差值

多重迴歸方程

     E(y)=β0+β1x1+β2x2+ ... +βpxp


估計多重回歸方程:
     y_hat=b0+b1x1+b2x2+ ... +bpxp
     一個樣本被用來計算β0,β1,β2... βp的點估計b0, b1, b2,..., bp

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
from numpy import genfromtxt
import numpy as np
from sklearn import datasets,linear_model

'''
要使print全部列印而不省略(http://blog.csdn.net/gzhermit/article/details/72716619)
np.set_printoptions(threshold = 1e6)#設定列印數量的閾值,1e6 = 1000000.0此方法為設定一較大值
或
np.set_printoptions(threshold='nan')  #全部輸出
'''
np.set_printoptions(threshold='nan')  #全部輸出

dataPath = r"Delivery.csv"
deliveryData = genfromtxt(dataPath,delimiter=',')   # csv檔案的分隔符是","

print "deliveryData:"
print deliveryData

X = deliveryData[:,:-1]
Y = deliveryData[:,-1]

print ("X:")
print (X)
print ("Y:")
print (Y)

# 線性迴歸方程
regr = linear_model.LinearRegression()

regr.fit(X,Y)

print "coefficients"
print regr.coef_
print "intercept: "
print regr.intercept_

xPred = [102, 6]
yPred = regr.predict(xPred)
print "predicted y: "
print yPred

Logistic 迴歸(Logistic Regression)

logistic迴歸(Logistic regression) 與多重線性迴歸實際上有很多相同之處,最大的區別就在於他們的因變數不同,其他的基本都差不多,正是因為如此,這兩種迴歸可以歸於同一個家族,即廣義線性模型(generalized linear model)。按照因變數的不同,如果是連續的,就是多重線性迴歸,如果是二項分佈,就是logistic迴歸。

logistic迴歸的因變數可以是二分非線性差分方程類的,也可以是多分類的,但是二分類的更為常用,也更加容易解釋。所以實際中最為常用的就是二分類的logistic迴歸。

.

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
import random


# m denotes the number of examples here, not the number of features
# 梯度下降策略
def gradientDescent(x, y, theta, alpha, m, numIterations):
    xTrans = x.transpose()  #轉置
    for i in range(0, numIterations):
        hypothesis = np.dot(x, theta)
        loss = hypothesis - y
        # avg cost per example (the 2 in 2*m doesn't really matter here.
        # But to be consistent with the gradient, I include it)
        cost = np.sum(loss ** 2) / (2 * m)
        print("Iteration %d | Cost: %f" % (i, cost))
        # avg gradient per example
        gradient = np.dot(xTrans, loss) / m
        # update
        theta = theta - alpha * gradient
    return theta



# 生成資料    numPoints例項數量,bias偏好,variance方差
def genData(numPoints, bias, variance):
    x = np.zeros(shape=(numPoints, 2))
    y = np.zeros(shape=numPoints)
    # basically a straight line
    for i in range(0, numPoints):
        # bias feature
        x[i][0] = 1
        x[i][1] = i
        # our target variable
        y[i] = (i + bias) + random.uniform(0, 1) * variance
    return x, y


# gen 100 points with a bias of 25 and 10 variance as a bit of noise
x, y = genData(100, 25, 10)
m, n = np.shape(x)
numIterations= 100000
alpha = 0.0005
theta = np.ones(n)  #theta和例項的維度一致
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)

.

梯度下降(gradient decent)

.


.

.

  • α為學習率
  • 同時對所有的θ進行更新
  • 重複更新直到收斂  

.

最小二乘法與梯度下降法

最小二乘法跟梯度下降法都是通過求導來求損失函式的最小值,那它們有什麼區別呢。

相同

1.本質相同:兩種方法都是在給定已知資料(independent & dependent variables)的前提下對dependent variables算出出一個一般性的估值函式。然後對給定新資料的dependent variables進行估算。

2.目標相同:都是在已知資料的框架內,使得估算值與實際值的總平方差儘量更小(事實上未必一定要使用平方),估算值與實際值的總平方差的公式為:

                             \Delta =\frac{1}{2} \sum_{i=1}^{m}{(f_{\beta }(\bar{x_{i}} )-y_{i})^{2} }

   其中\bar{x_{i} }為第i組資料的independent variable,y_{i}為第i組資料的dependent variable,\beta為係數向量。

不同

實現方法和結果不同:最小二乘法是直接對\Delta求導找出全域性最小,是非迭代法。而梯度下降法是一種迭代法,先給定一個\beta,然後向\Delta下降最快的方向調整\beta,在若干次迭代之後找到區域性最小。梯度下降法的缺點是到最小點的時候收斂速度變慢,並且對初始點的選擇極為敏感,其改進大多是在這兩方面下功夫。

皮爾遜相關係數 (Pearson Correlation Coefficient): 

衡量兩個值線性相關強度的量

取值範圍 [-1, 1]:

正向相關: >0, 負向相關:<0, 無相關性:=0


.

R平方值:

定義:決定係數,反應因變數的全部變異能通過迴歸關係被自變數解釋的比例。

描述:如R平方為0.8,則表示迴歸關係可以解釋因變數80%的變異。換句話說,如果我們能控制自變數不變,則因變數的變異程度會減少80%

簡單線性迴歸:

R^2 = r * r

多元線性迴歸:

R平方也有其侷限性:R平方隨著自變數的增加會變大,R平方和樣本量是有關係的。因此,我們要到R平方進行修正。修正的方法:

.

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
import numpy as np
from astropy.units import Ybarn
import math

#  計算相關度
def computeCorrelation(X, Y):
    xBar = np.mean(X)   #均值
    yBar = np.mean(Y)
    SSR = 0
    varX = 0
    varY = 0
    for i in range(0 , len(X)):
        diffXXBar = X[i] - xBar
        diffYYBar = Y[i] - yBar
        SSR += (diffXXBar * diffYYBar)
        varX +=  diffXXBar**2
        varY += diffYYBar**2
    
    SST = math.sqrt(varX * varY)
    return SSR / SST


testX = [1, 3, 8, 7, 9]
testY = [10, 12, 24, 21, 34]


print computeCorrelation(testX, testY)        

.

迴歸問題的準確性評價

建立迴歸器後,需要建立評價迴歸器擬合效果的指標模型。

  • 平均誤差(mean absolute error):這是給定資料集的所有資料點的絕對誤差平均值
  • 均方誤差(mean squared error):給定資料集的所有資料點的誤差的平方的平均值,最流行
  • 中位數絕對誤差(mean absolute error):給定資料集的所有資料點的誤差的中位數,可以消除異常值的干擾
  • 解釋方差分(explained variance score):用於衡量我們的模型對資料集波動的解釋能力,如果得分為1.0,表明我們的模型是完美的。
  • R方得分(R2 score):讀作R方,指確定性相關係數,用於衡量模型對未知樣本預測的效果,最好的得分為1.0,值也可以是負數。
.
import sklearn.metrics as sm

print('mean absolute error=',round(sm.mean_absolute_error(y_test,y_test_pre),2))
print('mean squared error=',round(sm.mean_squared_error(y_test,y_test_pre),2))
print('median absolute error=',round(sm.median_absolute _error(y_test,y_test_pre),2))
print('explained variance score=',round(sm.explained_variance _score(y_test,y_test_pre),2))
print('R2 score=',round(sm.r2_score(y_test,y_test_pre),2))

.

通常情況下,儘量保證均方誤差最低,而且解釋方差分最高。

.

Python環境下的8種簡單線性迴歸演算法

本文中,作者討論了 8 種在 Python 環境下進行簡單線性迴歸計算的演算法,對比了他們的計算複雜度。