1102 機器學習

這篇文章是學習時整理的一些筆記,讓自己複習時方便,文章內容為上課之內容整理


監督式學習最常處理的兩個問題:分類、迴歸
當預測的數值為連續的我們稱為迴歸,若是離散的,我們稱為分類
簡單來說,
迴歸就是找一條線,而該線盡可能的通過所有的資料點
分類就是把資料分到指定的幾個分類中

本篇主要是在講迴歸,若要看分類的在另外一則文章喔!

classification 文章筆記整理

迴歸分析

  • 迴歸分析是預測數值的分析
  • 在迴歸問題中,要從給予的資料來假設關係式(y=ax+b),逐步求取最適合的係數
  • 是監督是學習方式的一種:在學習時逐一給予正確答案,作為計算關聯的基礎
  • 若是輸入為一個變數則為「簡單迴歸分析」(y=ax+b),若是兩個以上則為「多元迴歸分析」(y=a₀x₀+…+aᵢxᵢ+b)

目的是在於可以找到一條線能讓各個資料點到達該線的距離總和最小

gan

簡單線性迴歸

輸入與輸出之間成立線性關係(y = ax + b)
我們可以以scikit-learn引入linear_model進行簡單係性迴歸分析

1
2
3
4
5
6
7
8
from sklearn import linear_model
reg = linear_model.LinerRegression() #生成線性回歸模型

reg.fit(X, Y) #計算預測模型(即算出迴歸係數a 與 截距b)

print(reg.coef_)
print(reg.intercept_)
print(reg.score(X, Y)) #決定係數
  • X, Y為解釋變數與目標變數資料,可以為多維
  • 使用最小平方來計算迴歸係數與截距

決定係數稱為貢獻度,以來表示,越接近1代表此模型越能代表資料,詳細整理前往這裡
gan

多元線性回歸

多元線性回歸的解釋變數有多個,藉由多元線性回歸我們可以計算出各個解釋變數之係數的推論預測值

以下以預測汽車價格的模型來舉例
資料如下圖(存於auto變數中):
gan

資料前處理範例

觀察資料

先觀察資料是什麼樣的? -> 為205列26行的資料

1
print('汽車資料的形式:{}'.format(auto.shape)) #會印出(205, 26) 是汽車資料的形式

在這個範例裡我們的目標就是要從price這個欄位以外的欄位去預測price這個欄位
因為從全部的欄位來解釋price會太複雜,因此以下的示範就以horsepowerwidthheight這三個欄位來預測模型

收到資料第一步要確認資料的正確性,再來確認資料的相關性

確認資料正確性

資料有時會包含不適當的東西,所以要進行確認,去除不必要的資料
head()函式可以發現資料有部分欄位為”?”

對於這些不正常的資料,我們可以:
- 去除那一列
- 補0
- 補前一列的值

1
2
auto = auto[['price', 'horsepower', 'width', 'height']]
auto.isin(['?']).sum() #計算個行列裡有多少?

可能顯示:
price 4
horsepower 2
width 0
height 0
dtype: int64

法一 去除那一列

將有?的欄位轉為遺漏值(NaN)後去除那一列

1
2
auto = auto.replace('?', np.nan).dropna()
print('汽車資料的形式:{}'.format(auto.shape)) #刪除後變成199列4行

確認資料型別

1
print('資料型別的確認(型別轉換前)\n{}\n'.format(auto.dtypes))

可能顯示:
資料型別的確認(型別轉換前)
price object
horsepower object
width float64
height float64
dtype: object

這樣就可以確認price和horsepower並非數值型別

我們可以使用to_numeric函式來轉換型別

1
2
3
auto = auto.assign(price=pd.to_numeric(auto.price))
auto = auto.assign(horsepower=pd.to_numeric(auto.horsepower))
print('資料型別的確認(型別轉換後)\n{}\n'.format(auto.dtypes))

可能顯示:
資料型別的確認(型別轉換後)
price int64
horsepower int64
width float64
height float64
dtype: object

確認資料相關性

接下來我們要確認資料之間的關聯性
我們可以使用corr函式

1
auto.corr()

可能顯示:

price horsepower width height
price 1.000 0.810 0.753 0.134
horsepower 0.810 1.000 0.615 -0.087
width 0.753 0.615 1.000 0.309
height 0.134 -0.087 0.309 1.000

目標變為price,觀察其他三個變數
發現horsepower和width的關係稍微偏高

相關性較高的變數同時作為多元線性回歸的解釋變數可能會發生多元共線性(mutli-collinearity)

多元共線性(mutli-collinearity)
多元共線性是由於變數間的高相關性,迴歸係數的變異數大,失去了係數的顯著性。

這樣的現象應該避免,所以建構多元線性回歸的模型時,通常只挑出能代表高相關性變數群的變數來用於模型

!!不過這裡只是實驗示範,因此後面的實作接還是以三個變數一起建構模型!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 指定目標變數與解釋變數
X = auto.drop('price', axis=1)
y = auto['price']

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5, random_state=0)

model = LinearRegression()
model.fit(X_train, Y_train)

#顯示決定係數
print('決定係數(train):{:.3f}'.format(model.score(X_train, Y_train)))
print('決定係數(test):{:.3f}'.format(model.score(X_test, Y_test)))

#顯示迴歸係數與截距
print('\n迴歸係數\n{}'.format(pd.Series(model.coef_, index=X.columns)))
print('截距:{:.3f}'.format(model.intercept_))