[读书笔记]机器学习:实用案例解析(6)
第6章 ?正則化:文本回歸
線性回歸的非線性擴展:廣義加性模型(GAM, Generalized Additive Model)R語言中可用gam()函數實現
多項式回歸:degree值不能無限增大,否則會產生過擬合(overfitting)現象。
過擬合:指模型擬合了部分噪聲
避免過擬合的手段:交叉驗證(cross-validation)和正則化(regularization)
模型復雜度:一個模型中特征的權重越大,這個模型越復雜
L1正則化(L1 norm)與L2正則化(L2 norm):分別累加模型系數的絕對值和系數的平方
set.seed(1) x <- seq(0, 1, by = 0.01) y <- sin(2 * pi * x) + rnorm(length(x), 0, 0.1) #L1 norm and L2 norm lm.fit <- lm(y ~ x) l2.model.complexity <- sum(coef(lm.fit) ^ 2) l1.model.complexity <- sum(abs(coef(lm.fit)))
可以訓練正則化的線性模型的函數:glmnet()
x <- as.matrix(cbind(x, rev(x))) library(glmnet) glmnet(x, y)
? ??
結果解釋:
Df:指明模型中的非零權重有幾個(不包括截距項)
%Dev:模型的R2值。第2行對應的是完全正則化,最后一行[55]對應的是完全沒有正則化
Lambda:超參數(hyperparameter)可以看做是一個懲罰參數,lambda很大時,表明對復雜度很在意,使模型權重趨于0,反之則會得到一個比較復雜的模型
為了得到最優模型,要設定一個大小適中的lambda. 為了得到這個lambda,首先設定一個較大的次數,比如10,然后使用不同的lambda分別在測試集上訓練模型,再看效果如何,最后通過迭代多次不同的lambda,找到這個最好的lambda
########################################################
#文本回歸
#研究描述文本與銷量之間的關系
#將原始數據集轉化為一個文檔詞項矩陣
#這里注意,由于tm包更新到0.6-0以后,tolower()等函數的返回有可能不是dtm的格式(之前版本默認返回相應格式)
#因此書中模型會有一個錯誤
#需要將代碼修改為
corpus <- Corpus(DataframeSource(documents)) corpus <- tm_map(corpus, content_transformer(tolower)) corpus <- tm_map(corpus, content_transformer(stripWhitespace)) corpus <- tm_map(corpus, removeWords, stopwords('english')) dtm <- DocumentTermMatrix(corpus)
#將文檔詞項矩陣轉換為一個簡單矩陣,將順序值顛倒過來作為預測值(使權重未正)
#初始化隨機種子
#對于6個lambda值,分別交叉驗證50次,并作圖
分析:由圖可見,隨著lambda越來越大,模型的表現越來越好,但是lambda增大后是趨于簡化模型,即常數模型的情況,沒有用到特征的信息。
簡而言之,這個文本回歸模型沒有發現有意義的信息,給出的預測完全是隨機噪聲。
#########################################################################
數據中也許并沒有答案。有一堆數據和對答案的熱切渴望,并不能確保真的能從這堆數據中提取出合理的預期答案。
——John Tukey
#########################################################################
將回歸問題轉化為分類問題,采用邏輯回歸的辦法再進行嘗試
#分類辦法:用邏輯值1/0作為分類標準,是否進入前50
#評價模型的標準用錯誤率評價,更多的循環次數會對錯誤率有更準確的估計
#代碼優化:將兩個循環交換,不必為每一個lambda做多次拆分,提高運行效率
set.seed(1) performance <- data.frame() for(i in 1:250) {indices <- sample(1:100, 80)training.x <- x[indices, ]training.y <- y[indices]test.x <- x[-indices, ]test.y <- y[-indices]for(lambda in c(0.0001, 0.001, 0.0025, 0.01, 0.025, 0.5, 0.1)) {glm.fit <- glmnet(training.x, training.y, family = 'binomial')predicted.y <- ifelse(predict(glm.fit, test.x, s = lambda) > 0, 1, 0)error.rate <- mean(predicted.y != test.y)performance <- rbind(performance, data.frame(Lambda = lambda, Iteration = i, ErrorRate = error.rate))} } ggplot(performance, aes(x = Lambda, y = ErrorRate)) + stat_summary(fun.data = 'mean_cl_boot', geom = 'errorbar') + stat_summary(fun.data = 'mean_cl_boot', geom = 'point') + scale_x_log10()
結果可以看到,將回歸問題改成分類問題時,較小的lambda可以預測一本書能否進入銷售榜前50,是有意義的。
?
總結:有些情況下,手中的數據并不能解決較復雜的問題(回歸問題:預測排行),但是卻可以解決一些簡單問題(分類問題:是否進入前50)
參考:http://stackoverflow.com/questions/24191728/documenttermmatrix-error-on-corpus-argument
轉載于:https://www.cnblogs.com/gyjerry/p/5578638.html
總結
以上是生活随笔為你收集整理的[读书笔记]机器学习:实用案例解析(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】eclipse 自动关闭总结
- 下一篇: xcode -饼状进度条