回歸分析(Regerssion Analysis)
——研究自變量與因變量之間關系形式的分析方法,它主要是通過建立因變量y 與影響他的自變量Xi 之間的回歸模型,來預測因變量y 的發展趨勢。
一、回歸分析的分類
- 線性回歸分析
- 簡單線性回歸分析
- 多重線性回歸分析
- 非線性回歸分析
- 邏輯回歸
- 神經網絡
二、回歸分析的步驟:
- 根據預測目標,確定自變量與因變量
- 繪制散點圖,確定回歸模型類型
- 估計模型參數,建立回歸模型
- 對回歸模型進行檢驗
- 利用回歸模型進行預測
簡單線性回歸模型: y = a + bx + e (e為隨機誤差,∑ei2 為殘差,是判斷模型擬合好壞的重要指標),使用最小二乘法獲得模型參數
回歸方程的精度就是用來表示實際觀測點和回歸方程的擬合程度的指標,使用判定系數來度量。
判定系數 = 相關系數R2 = ESS/TSS = 1- (RSS/TSS) ,其中TSS 為總離差平方和,ESS 為回歸平方和 ,RSS 為殘差平方和
#繪制散點圖和相關系數 plt.scatter(data.廣告投入,data.銷售額) data.corr() #估計模型參數,建立回歸模型 lrmodel = LinearRegression() x = data[['廣告投入']] y = data[['銷售額']] #訓練模型 lrmodel.fit(x,y) #對模型進行檢驗,得到模型評分 lrmodel.score(x,y) #利用模型進行預測,自變量需要用數組進行傳入 lrmodel.predict([[50]]) #查看參數 a = lrmodel.intercept_[0] b = lrmodel.coef_[0][0]
多重線性回歸模型(Multiple Linear Regression): y = a + b1x1 + b2x2 + b3x3 + …… + bnxn+ e (e為隨機誤差,∑ei2 為殘差,是判斷模型擬合好壞的重要指標),使用最小二乘法獲得模型參數
回歸方程的精度就是用來表示實際觀測點和回歸方程的擬合程度的指標,使用判定系數來度量。
調整判定系數 = 相關系數R2 = ESS/TSS = 1- [RSS/(n-k-1)] / [TSS/(n-1)] ,其中TSS 為總離差平方和,ESS 為回歸平方和 ,RSS 為殘差平方和 ,n為樣本個數 ,k為變量個數
import matplotlib from pandas.tools.plotting import scatter_matrix #繪制兩兩之間的散點圖並得到相關系數 font = {'family':'SimHei'} matplotlib.rc('font',**font) scatter_matrix(data_1[['店鋪的面積','距離最近的車站','月營業額']], figsize=(10,10),diagonal='kde') data_1[['店鋪的面積','距離最近的車站','月營業額']].corr() #估計模型參數,建立回歸模型 lrmodel_1 = LinearRegression() x1 = data_1[['店鋪的面積','距離最近的車站']] y1 = data_1[['月營業額']] #訓練模型 lrmodel_1.fit(x1,y1) #對模型進行檢驗,得到模型評分 lrmodel_1.score(x1,y1) #利用模型進行預測,自變量需要用數組進行傳入 lrmodel_1.predict([[10,110]]) lrmodel_1.predict([[10,110],[20,120]]) #查看參數 a1 = lrmodel_1.intercept_[0] b1 = lrmodel_1.coef_[0][0] b2 = lrmodel_1.coef_[0][1]
一元非線性回歸模型(Univariate Nonlinear Regression):只包括一個自變量和一個因變量,且二者的關系可用一條曲線近似表示,則稱為一元非線性回歸(一元n次方程)
y = a2x2+ a1x1 + a0x0 (一元二次方程)
核心思想:用換元法將一元多次方程轉化為多元一次方程
使用的關鍵類:from sklearn.preprocessing import PolynomialFeatures
例如:兩個變量的散點圖類似於一元二次方程的一部分,所以可以使用一元二次方程作為模型;
為了得到模型的結果,需要生成一個次方為2次的轉換類對象:
pf = PolynomialFeatures(degree=2) #degree為次數
x_2_fit = pf.fit_transform(x) #轉換后的自變量,得到包含x及x2的數組
####核心思想:將一元n次方程,轉換為多元線性方程 from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures #生成一個次方為2次的轉換類對象 x pf = PolynomialFeatures(degree=2) x_2_fit = pf.fit_transform(x) #模型測試及后續 lrmodel = LinearRegression() lrmodel.fit(x_2_fit,y) lrmodel.score(x_2_fit,y) #訓練后輸入因變量時,同樣需要將原始的因變量通過fit_transform方法進行轉換,再得到預測結果 x_2_predict = pf.fit_transform([[21]]) x_2_predict = pf.fit_transform([[22],[23]]) lrmodel.predict(x_2_predict)
邏輯回歸模型 (Logistic Regression):針對因變量為分類變量而進行回歸分析的一種統計方法,屬於概率型非線性回歸
優點:算法易於實現和部署,執行效率和准確度高
缺點:離散型的自變量數據需要通過生成虛擬變量的方式來使用
s型函數(Sigmoid Function) : 將連續數據變為(0,1)的范圍,即歸一化,將連續型數據變換為離散型數據的方法


當z為0的時候,函數值為0.5;隨着z的增大,函數值逼近於1;隨着z的減小,函數值逼近於0.
所以,這個函數很適合做我們剛才提到的二分類的分類函數。假設輸入數據的特征是(x0, x1, x2, ..., xn),我們在每個特征上乘以一個回歸系數 (w0, w1, w2, ... , wn),然后累加得到sigmoid函數的輸入z:
那么,輸出就是一個在0~1之間的值,我們把輸出大於0.5的數據分到1類,把輸出小於0.5的數據分到0類。這就是Logistic回歸的分類過程。
我們要做的,就是確定這個分類器中的最佳回歸系數,即(w0, w1, w2, ... , wn)
使用python進行邏輯回歸預測的步驟
1、讀取訓練集
2、對數據進行預處理,用虛擬變量來處理非數值變量
離散特征取值沒有大小意義的處理函數 pd.get_dummies ,例如性別、結果為是/否的變量。也可以用來處理答案有多種,但沒有次序區分的變量,即用幾個變量作為一組(輸入都是0/1)來表示某個分類變量,例如手機運營商的選擇,可以由運營商1(是/否)、運營商2(是/否)、運營商3(是/否)……這樣的一組變量來表示。
#選擇部分非數值變量轉化為虛擬變量 dummycolumns = ['Gender','Home Ownership','Internet Connection', 'Marital Status','Movie Selector','Prerec Format', 'TV Signal'] for column in dummycolumns: data1[column] = data1[column].astype('category') dummyData = pd.get_dummies(data,columns=dummycolumns, prefix=dummycolumns, prefix_sep=' ', drop_first=True)
離散特征之間有大小意義的處理函數 pd.series.map (dict) ,例如學歷、看電影的頻率等,需要先設置虛擬變量對應的值,以學歷為例,需要按學歷高低,賦予有序的值
#以學歷為例,需要按學歷高低,賦予有序的值 educationLevelDict = { 'Post-Doc': 9, 'Doctorate': 8, 'Master\'s Degree': 7, 'Bachelor\'s Degree': 6, 'Associate\'s Degree': 5, 'Some College': 4, 'Trade School': 3, 'High School': 2, 'Grade School': 1} #按學歷構建虛擬變量后,作為新列加入到數據框中 dummyData['Education Level Map'] = dummyData['Education Level'].map(educationLevelDict)
3、根據虛擬化后的新的數據集構建模型,選擇需要的變量
dummySelect=[ ……] #設置輸入項為剛才選取的變量 inputData = dummyData[dummySelect] #設置輸出項為 series1 outputData = dummyData[['series1']]
4、模型構建、訓練、評分
from sklearn import linear_model lrModel = linear_model.LogisticRegression() lrModel.fit(inputData, outputData) lrModel.score(inputData, outputData)
5、模型的使用
由於參數是以虛擬變量的形式進行輸入的,所以對未知數據集需要進行同樣的虛擬化操作,讓后將變量作為參數進行傳入,然后再得到預測結果
#對測試集進行同樣的虛擬化操作
#輸入測試集作為參數 inputNewData = dummyNewData[dummySelect] #得到預測結果,以序列形式進行輸出 lrModel.predict(inputNewData)
最終得到按序列形式輸出的預測結果