天天看點

練習:python實作線性回歸+資料可視化+模型解釋

github:https://github.com/iluccica/MLPractice/tree/master/LinearRegression

資料集:從衛健委找的幾條新冠肺炎資料 ,長這樣:

練習:python實作線性回歸+資料可視化+模型解釋

目标:對新增确診病例(increment)做回歸分析。

1.單元線性回歸

預測新增病例随天數的變化。

#處理exel資料的庫
import xlrd
import matplotlib.pyplot as plt
import numpy as np

#get the table
table = data.sheet_by_index(0)
# get x and y
X = table.col_values(0)[1:table.nrows]
Y = table.col_values(1)[1:table.nrows]
X = np.array(X)
Y = np.array(Y)

## preprocessing
# X = X/abs(X.max())
# Y = Y/abs(Y.max())

           

單元線性回歸求參數模型:

練習:python實作線性回歸+資料可視化+模型解釋
#bulid model
Xsum = 0
X2sum = 0
Ysum = 0
XY = 0

#樣本數
n = table.nrows - 1
for i in range(n):
    Xsum += X[i]
    Ysum += Y[i]
    X2sum += X[i]**2
    XY = X[i] * Y[i]
    
k = (XY - Xsum * Ysum / n) / (X2sum - Xsum**2/n)
b = (Ysum - k * Xsum) / n

#預測20天的
days = range(0,20)

Y_pred = k*days + b

#plot
plt.plot(X,Y,'go', label='Original Data')
plt.plot(days,Y_pred,'r-', label='Fitted Line')
plt.title('pneumonia prediction')
plt.xlabel('Date')
plt.ylabel('Increment')
plt.legend()
plt.show()
           
練習:python實作線性回歸+資料可視化+模型解釋

2.多元線性回歸

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#畫散點圖好用的
import seaborn as sns
from sklearn.preprocessing import  StandardScaler

#讀資料
data = pd.read_csv('pneumonia.csv')

#資料歸一,标準化
# ss = StandardScaler()
# scale_features = data.columns.values
# data[scale_features] = ss.fit_transform(data[scale_features])
# print(data)

##計算統計量,均值 标準差
#print(data.describe())

##找到缺失值
#print(data[data.isnull()==True].count())

#特征箱型圖,看下特征值的分布
# data.boxplot()
# plt.show()
# plt.savefig("boxplot.jpg")
           
練習:python實作線性回歸+資料可視化+模型解釋

特征值分布有點分散,可以考慮歸一化。

#相關系數矩陣
# print(data.corr())

#單類特征對結果的回歸圖
# sns.pairplot(data,x_vars=['days','Suspected cases(1 day before)','close exposure(1 day before)'],y_vars='increment',
#              size=4,kind='reg')
# plt.show()
           
練習:python實作線性回歸+資料可視化+模型解釋

陰影為95%置信區間。

#建立模型
#這裡沒設定test集和accuracy,epoch沒必要
epoch = 10
model = LinearRegression()
w_total = np.empty([10,3])
for i in range(0,epoch):
    model.fit(data[np.delete(data.columns,1)],data['increment'])
    b = round(model.intercept_,3)
    np.set_printoptions(precision=3, suppress=True)
    w = model.coef_
    # print("b = ",b,"\nw = ",w)
    w_total[i] = w

#權重增加列名
w_total = pd.DataFrame(w_total,columns=['days','Suspected cases(1 day before)','close exposure(1 day before)'])

#這個例子裡十次的權重都是一樣的,随便拿一組,來計算解釋環節用到的影響程度
new_w = w_total.loc[0]

#計算某個特征對結果的影響
effect = data[np.delete(data.columns,1)]
for idx in np.delete(data.columns,1):
    effect[idx] = effect[idx]*new_w[idx]
 
#影響圖
effect.boxplot(vert = False)
plt.show()   
           
練習:python實作線性回歸+資料可視化+模型解釋

影響圖可以用來向客戶、使用者解釋模型,具體如何解釋:《解釋性機器學習》筆記(一):了解線性回歸模型中的權重、特征和結果。

繼續閱讀