Python實現機器學習之迴歸分析
阿新 • • 發佈:2018-11-07
前言
機器學習常用來解決相關分析和迴歸分析的問題,有時候大家會混淆兩者之間的差異,這裡通過對比分析來說明兩者的區別和聯絡,最後會以呼叫sklearn包中LinearRegression方法進行簡單線性迴歸分析為例,說明如何使用python進行資料分析。
一、相關分析和迴歸分析
1.1 兩者的定義
相關分析(Correlation analysis):研究兩個或兩個以上處於同等地位的隨機變數間的相關關係的統計分析方法。
對於線性相關而言有三種類型:正線性相關(總體表現直線朝上);負線性相關;非線性相關。
迴歸分析(Regression analysis):確定兩種或兩種以上變數間相互依賴定量關係的統計方法。
根據不同的維度可以將回歸分析分為:一元迴歸和多元multivariate迴歸分析(因變數多少);簡單迴歸和多重multiple迴歸分析(自變數多少);線性迴歸和非線性迴歸(自變數及因變數間關係型別)。
1.2衡量指標
相關分析:
- 相關係數corrcoef(data):先對變數做標準化變換,然後再計算協方差,把先標準化變換後做協方差運算定義為變數間的相關係數(皮爾遜相關係數)。
- 協方差cov(data,bias=1):描述變數間相互關係,兩隨機向量X,Y之間的協方差定義為cov(X,Y)=E[(X-E(X))(Y-E(Y))],E表示數學期望。
迴歸分析:
- 決定係數R平方:評估得到的迴歸方程是否較好的擬合了樣本資料。
1.3區別與聯絡
兩者的區別
- 相關分析中涉及的變數不區分自變數和因變數,變數之間關係是對等的;迴歸分析中,需要根據研究物件的性質和研究分析的目的,區分變數為自變數和因變數。
- 相關分析中所有變數必須是隨機變數;迴歸分析中,自變數是確定的,而因變數才是隨機的。
- 相關分析主要通過“相關係數”反映變數間相關程度的大小,因為變數間關係是對等的,所有相關係數是唯一的;迴歸分析中,自變數和因變數之間可能存在多個迴歸方程。
兩者的聯絡
- 相關分析是迴歸分析的基礎和前提,迴歸分析是相關分析的深入和繼續。
- 相關分析表現變數間數量變化的相關程度,迴歸分析表現變數間數量相關的具體形式。
- 只有變數間存在高度相關時,進行迴歸分析需求具體形式才有意義。
二、迴歸分析的Python實現
問題:探究“學習時長”和“學習成績”之間是否存在相關性關係,如果有找出其迴歸方程。
2.1理解資料
1、匯入資料包
#匯入資料包
import warnings
from collections import OrderedDict
import pandas as pd
import numpy as np
warnings.filterwarnings('ignore')
2、建立資料並檢視資料
#建立資料並檢視資料
examDict={'學習時間':list(np.arange(0.5,5.5,0.25)),
'學習成績':[10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]}
examOrderedDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderedDict)
examDf.head()
#檢視資料描述統計資訊
examDf.describe()
>>>
學習時間 學習成績
0 0.50 10
1 0.75 22
2 1.00 13
3 1.25 43
4 1.50 20
學習時間 學習成績
count 20.00000 20.000000
mean 2.87500 53.700000
std 1.47902 26.435821
min 0.50000 10.000000
25% 1.68750 30.250000
50% 2.87500 58.500000
75% 4.06250 75.250000
max 5.25000 93.000000
3、提取特徵值和標籤
#特徵值:解釋變數(自變數),一般加X為字尾
#標籤:因變數,一般加y為字尾
exam_X=examDf['學習時間']
exam_y=examDf['學習成績']
4、利用散點圖檢視資料間關係
import matplotlib.pyplot as plt
#散點圖
plt.scatter(exam_X,exam_y,color='b',label='考試資料')
#橫縱軸標籤
plt.legend(loc=2)
plt.xlabel('學習時間')
plt.ylabel('學習成績')
plt.show()
5、求出變數間相關係數
#變數間的相關係數
rDf=examDf.corr()
print(rDf)
>>>
學習時間 學習成績
學習時間 1.0000 0.9379
學習成績 0.9379 1.0000
從散點圖中,我們可以看出學習時長和學習成績之間應該存線上性相關關係,且相關係數為0.9379呈現強線性相關關係(模型選擇時,我們會建立線性迴歸模型進行擬合)。
2.2構建模型
1、從資料集中分離出訓練資料train和測試資料test
from sklearn.cross_validation import train_test_split
#建立訓練集和測試集資料
train_X,test_X,train_y,test_y =train_test_split(exam_X,exam_y,train_size=0.8)
#輸出訓練集和測試集資料大小
print('訓練集大小',train_X.shape,train_y.shape)
print('測試集大小',test_X.shape,test_y.shape)
>>>
訓練集大小 (16,) (16,)
測試集大小 (4,) (4,)
2、建立線性迴歸模型
#匯入線性迴歸模型
from sklearn.linear_model import LinearRegression
#建立模型
model=LinearRegression()
3、訓練模型
在這裡插入程式碼片#匯入模型的資料應為一列資料
train_X=train_X.values.reshape(-1,1)
train_y=train_y.values.reshape(-1,1)
test_X=test_X.values.reshape(-1,1)
test_y=test_y.values.reshape(-1,1)
print('訓練集大小',train_X.shape,train_y.shape)
print('測試集大小',test_X.shape,test_y.shape)
model.fit(train_X,train_y)
>>>
訓練集大小 (16, 1) (16, 1)
測試集大小 (4, 1) (4, 1)
2.3評估模型
1、檢視模型得分
#檢視模型得分
print('模型得分為',round(model.score(test_X,test_y),4))
>>>
模型得分為 0.4662
2、求出並繪製模型擬合線(模型的迴歸方程)y=a+bx
#模型擬合線(模型的迴歸方程)y=a+bx
a=model.intercept_
b=model.coef_
print('模型的迴歸方程是:y=%f+%f x'%(a,b))
>>>
模型的迴歸方程是:y=4.197326+16.893159 x
#繪製擬合曲線
plt.scatter(train_X,train_y,color='b',label='train data')
test_y_pred=model.predict(test_X)
plt.plot(test_X,test_y_pred,color='black',label='best line')
#測試集資料的散點圖
plt.scatter(test_X,test_y,color='r',label='test data')
#座標軸
plt.xlabel('學習時間')
plt.ylabel('學習成績')
plt.legend(loc=2)
plt.show()