github:https://github.com/iluccica/MLPractice/tree/master/LinearRegression
資料集:從衛健委找的幾條新冠肺炎資料 ,長這樣:

目标:對新增确診病例(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())
單元線性回歸求參數模型:
#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()
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")
特征值分布有點分散,可以考慮歸一化。
#相關系數矩陣
# 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()
陰影為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()
影響圖可以用來向客戶、使用者解釋模型,具體如何解釋:《解釋性機器學習》筆記(一):了解線性回歸模型中的權重、特征和結果。