2018年3月11日

R語言常用迴歸分析簡介

本篇是出自 Udemy 的 MACHINE LEARNING A-Z 課程的筆記加上個人見解,有些範例會以課程內容為主。

課程主要包含以下九大項,
  1. 迴歸
  2. 分類
  3. 分群
  4. 關聯規則學習
  5. 強化學習
  6. 自然語言處理
  7. 深度學習
  8. 降低維度
  9. 模型的選擇與評估
以R與Python語言為範例內容,我只看了R語言的部份。


跟統計學有關的部份包含迴歸、分類(分群)、降低維度三大項,若只要學習跟統計有關的部份,可以只看這三個部份,而我也指會對這三個部份做詳細的解說。

這些課程有個共通的目標,就是有一份已知的資料,分成訓練組與測試組,用下列方法已訓練組建立模型,並拿測試組測試結果好壞。

迴歸主要要預測的是數值型的資料,比方有一張身體檢查的表,要預測血壓個高低;或是一張年齡與性別的表,要預測收入等等。輸入的項目可以是數值或類別(男女),但輸出是數值(身高、收入)。

分類主要是要預測類別型的資料,比方有一張性別與收入資料的表,要預測會不會買車(是或否);或是一張鐵達尼號乘客的資料,預測是否存活(是或否)。通常分類的結果是二元的,但也可以是多元的,有些多元的方法就會被歸類在分群之中。

降低維度是因為使用者可能輸入很多資料,但每個資料都很重要,不想要放棄,就可以透過一些投影方法使多維度的資料降低成2維(或是2以上)。在不減少資料的資訊量情況下,將資料降低維度後可能更容易分類或分群。視覺化的效果也會比較好。

零.資料的前處理
1.類別資料
使用data[,2]=factor(data[,2])定義資料為類別資料,有時在讀入數值型資料時,會因為有遺漏項而被判讀成類別資料,此時要
data=read.csv("~/Sync/EEWana/fftfigure/W035_ILA023_n_new.csv",header = T,stringsAsFactors = F)
補上 stringsAsFactors = F的項目,並將其他類別資料用factor()定義完成。

2.尺度縮放

並不是每種情況都要尺度縮放,還是要看資料的性質與方法來決定。
優點1:平衡每個變數的權重
優點2:加速梯度下降法,因為尺度相同,梯度就是圓形,可以直接朝圓心前進。

方法有
1.Normalization(通常稱正規化),所有資料縮放成0~1之間,方法是減去最小值後除以全距
2.Standardization(標準化),所有資料縮放成平均值0,標準差1的資料,方法是減去平均後除以標準差。

一.迴歸

1.普通線性迴歸

普通線性迴歸只考慮一個自變數,一個應變數,自變數是X軸,用來預測應變數Y軸。
常見的例子如用年資來預測薪水

# 輸入資料
dataset = read.csv('Salary_Data.csv')

# 隨機區分成訓練組跟測試組
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Salary, SplitRatio = 0.6)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# 尺度縮放,有些資料需要,有些資料不用,端看自己需要
# training_set = scale(training_set)
# test_set = scale(test_set)

# 簡單線性迴歸
regressor = lm(formula = Salary ~ YearsExperience,
               data = training_set)
summary(regressor)

# 將測試組帶入模型中預測結果
y_pred = predict(regressor, newdata = test_set)

#繪出圖片
plot(training_set[,2]~training_set[,1])
abline(regressor)

plot(test_set[,2]~test_set[,1])
abline(regressor)

補充:虛擬變數(dummy variable),稀疏矩陣,熱讀編碼(one-hot encoding)三個概念都是雷同的,要用來創造出機器可讀取的資料表。

2.多元線性迴歸

多元線迴歸是指有多個自變數要擬合出一個應變數的情況,如 Y=aX1+bX2+cX3 等式子,X1 X2 X3 三個自變數透過加權產生一個應變數 Y。

多元迴歸分析是很常見的統計方法,他最常遇到的問題是到底要選幾個加到迴歸式子裡,假設我有 8 個自變數,1 個應變數,要挑選全部 8 個都放到迴歸式子裡嗎?這裡就要透過逐步多元迴歸分析這個技巧,來挑選出最佳的組合進入式子中,排除影響不大的自變數。這點後面會談到。

如果多元迴歸分析中有類別資料(比方男女、車的班次、居住縣市、船的艙等),要特別挑出來,使用factor()函數,告訴電腦這是類別資料,不是數值資料。

# 輸入資料
dataset = read.csv('50_Startups.csv')

# 標記類別資料,並換成代號 1 2 3
dataset$State = factor(dataset$State,
                       levels = c('New York', 'California', 'Florida'),
                       labels = c(1, 2, 3))

# 隨機區分成訓練組跟測試組
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Profit, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# 尺度縮放,有些資料需要,有些資料不用,端看自己需要
# training_set = scale(training_set)
# test_set = scale(test_set)

# 多元迴歸分析,帶入所有自變數
regressor = lm(formula = Profit ~ .,data = training_set)
> summary(regressor) 
Call:
lm(formula = Profit ~ ., data = training_set)

Residuals:
   Min     1Q Median     3Q    Max 
-33128  -4865      5   6098  18065 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      4.965e+04  7.637e+03   6.501 1.94e-07 ***
R.D.Spend        7.986e-01  5.604e-02  14.251 6.70e-16 ***
Administration  -2.942e-02  5.828e-02  -0.505    0.617    
Marketing.Spend  3.268e-02  2.127e-02   1.537    0.134    
State2           1.213e+02  3.751e+03   0.032    0.974    
State3           2.376e+02  4.127e+03   0.058    0.954    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9908 on 34 degrees of freedom
Multiple R-squared:  0.9499, Adjusted R-squared:  0.9425 
F-statistic:   129 on 5 and 34 DF,  p-value: < 2.2e-16

可以看到有顯著的只有 R.D.Spend,最不顯著的是State2 State3,他們是虛擬變數dummy variable,我們可以把最不顯著的逐步移除,最後留下最後最顯著的。

regressor = lm(formula = Profit ~ R.D.Spend + Administration + Marketing.Spend ,
               data = dataset)
summary(regressor)
Call:
lm(formula = Profit ~ R.D.Spend + Administration + Marketing.Spend, 
    data = dataset)

Residuals:
   Min     1Q Median     3Q    Max 
-33534  -4795     63   6606  17275 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      5.012e+04  6.572e+03   7.626 1.06e-09 ***
R.D.Spend        8.057e-01  4.515e-02  17.846  < 2e-16 ***
Administration  -2.682e-02  5.103e-02  -0.526    0.602    
Marketing.Spend  2.723e-02  1.645e-02   1.655    0.105    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9232 on 46 degrees of freedom
Multiple R-squared:  0.9507, Adjusted R-squared:  0.9475 
F-statistic:   296 on 3 and 46 DF,  p-value: < 2.2e-16

# 預測測試組的結果
y_pred = predict(regressor, newdata = test_set)

#評估模型的好壞
AIC(regressor)

如何選取適當的自變數加到迴歸模型?

1.全部都選
2.後退減少
3.向前增加
4.雙向
5.列出所有排列組合,選擇最好的模型

選取哪種方法完成你的多元迴歸模型,端看你的目的與數據決定,以下簡述各個方法。

1.全部選擇,丟進你所有的自變數並完成模型。

通常不會推薦這個方法,除非你很確定你所有自變數都要、老闆規定你這麼做、前人完成的模型說這樣是對的。不然通常是錯的。
全部選擇也是一開使用來簡易了解模型的方法。

2.後退減少

將所有自變數丟進去模型中,把最不顯著的自變數移除,重新跑一次模型,再把最不顯著的自變數移除......,直到所有的自變數都有顯著(通常是0.05)。最常見也最簡單直觀的方法。

3.向前增加

假設你有X1~X5五項自變數,先做完5個模型,分別是Y~X1、Y~X2、Y~X3、Y~X4、Y~X5,看哪個最顯著,假設是Y~X3;
那麼就剩下四個自變數X1、X2、X4、X5,再做4個模型,分別是Y~X3+X1、Y~X3+X2、Y~X3+X4、Y~X3+X5,這4個模型中看哪個最顯著,再加入下個自變數。
如果加入某個自變數後出現不顯著的結果,例如 Y~X3+X1+X4,其中 X4 的 p-value=0.07,那麼模型就是Y~X3+X1。

4.雙向

從向前增加開始,做完所有模型,選定最顯著的當成自變數,接著再選第二個最有顯著的組合,如果在這個向前的步驟中,有一個自變數不顯著了,就要把他移除,進行後退減少,直到沒有後繼續前進。最後到無法前進與後退時,模型即完成。

234三個方法統稱逐步多元迴歸,其實就是雙向的步驟。

5.列出所有排列組合,選擇最好的模型

最慢最準的方法,假設你有10個自變數,那要測試1023種排列組合,但其實用電腦自動計算也不是太慢。
通常這時候不使用R-squared來評估模型,而是採用Adjusted R-squared或是AIC等方法評估模型好壞。

Adjusted R-squared 是為了避免項次越多,R2越大的錯誤估計,Adj-R2加入項次的調整。
1-(1-R^2)*(n-1)/(n-p-1)
p=迴歸項目數量,n=sample size

3.多項式迴歸

多項式迴歸通常是指指數函數類的圖形,例如Y=aX^4+bX^3+cX^2+dX^1+e,自變數只有一個X,但有不同的次方。
值得注意的是,這還是屬於線性回歸,不能因為畫出來的圖形是指數曲線,就說他不是線性迴歸。課程中表示,線性的意思是指a,b,c,d等這幾個係數,Y這項應變數是否能用幾項線性的係數乘上幾個X,來達到擬合。故會稱為是線性的。

dataset$Level2 = dataset$Level^2
dataset$Level3 = dataset$Level^3
dataset$Level4 = dataset$Level^4
poly_reg = lm(formula = Salary ~ .,data = dataset)
summary(poly_reg)
此方法只是創造出更多的變數來代表X^2、X^3、X^4,然後跑多元回歸分析。

4.支持向量迴歸 Support Vector Regression (SVR)

支持向量迴歸最好用分類的思維來理解,在分類時會再解釋。很多分類的工具可以直接拿來當成回歸的工具,只是把分類的結果轉成數字罷了。

支持向量迴歸如同支持向量機,在數據點中畫出一條線,線的兩旁有寬度,此寬度範圍簡稱道路,迴歸的目的在找到一條道路,使的各點到道路的距離總和最小,參考如何通俗易懂地解释支持向量回归(support vector regression)?,參考:參數調整

dataset = read.csv('Position_Salaries.csv')
dataset = dataset[2:3]

# install.packages('e1071')
library(e1071)
regressor = svm(formula = Salary ~ .,
                data = dataset,
                type = 'eps-regression')
#type = 'eps-regression' 選擇非線性的迴歸形式,要線性的話要補上kernel="linear"
y_pred = predict(regressor, data.frame(Level = 6.5))

5.決策樹(迴歸,又稱迴歸樹)

決策樹是一種用來分類的工具,但也可以用來做迴歸。將資料分類後給予一個數值,也就是迴歸出來的數值。決策樹會產生一個二分的樹狀結構,將資料分成兩邊,在不斷二分成更多類群。

library(rpart)
regressor = rpart(formula = Salary ~ .,data = dataset)
regressor = rpart(formula = Salary ~ .,data = dataset,control = rpart.control(minsplit = 1))

6.隨機森林

隨機挑選不同數量的自變數(特徵、屬性)建立多個分類樹,所有分類樹計算完後,再投票選出結果。假設一份資料有6個自變數,共有6!種排列組合方式,假設至少採用3個自變數,也有C(6,3)=20種排列組合,這20種排列組合,各自可以生成1棵分類樹,所以模型中共有20棵分類樹,稱為森林,當一筆新的資料進來,透過20棵分類樹彼此進行分類迴歸後,共有20個結果,此結果可以投票產生最後結果(分類-類別資料),或是平均出最後結果(迴歸-數值資料)。

隨機森林演算法可以避開一些影響較小的自變數,結果往往會比單純的分類樹來的好,而要決定的屬性包括樹的數量,
# install.packages('randomForest')
library(randomForest)
set.seed(1234)
regressor = randomForest(x = dataset[1], y = dataset$Salary, ntree = 10)
regressor = randomForest(x = dataset[1], y = dataset$Salary, ntree = 500)
summary(regressor)
# Predicting a new result with Random Forest Regression


y_pred = predict(regressor, data.frame(Level = 6.5))

沒有留言:

張貼留言