課程主要包含以下九大項,
- 迴歸
- 分類
- 分群
- 關聯規則學習
- 強化學習
- 自然語言處理
- 深度學習
- 降低維度
- 模型的選擇與評估
以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()定義完成。
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等方法評估模型好壞。
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 = 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))
沒有留言:
張貼留言