版權聲明:本文爲博主原創文章,轉載請註明出處算法
機器學習的研究領域是發明計算機算法,把數據轉變爲智能行爲。機器學習和數據挖掘的區別多是機器學習側重於執行一個已知的任務,而數據發掘是在大數據中尋找有價值的東西。數據庫
用於分類:k近鄰,樸素貝葉斯,決策樹,規則學習,神經網絡,支持向量機
用於數值預測:線性迴歸,迴歸樹,模型樹,神經網絡,支持向量機網絡
用於模式識別(數據之間聯繫的緊密性):關聯規則
用於聚類:k均值聚類app
llibrary(class) library(gmodels) #prepare data set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] iris_z <- as.data.frame(scale(iris_rand[,-5])) #z score normalize train <- iris_z[1:105,] test <- iris_z[106:150,] train.label <- iris_rand[1:105,5] test.label <- iris_rand[106:150,5] #kNN pred <- knn(train,test,train.label,k=10) #comfusion matrix CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
這個結果顯示kNN對測試數據所有預測正確dom
library(e1071) library(gmodels) set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train <- iris_rand[1:105,-5] test <- iris_rand[106:150,-5] train.label <- iris_rand[1:105,5] test.label <- iris_rand[106:150,5] #tranform numerical variable to classified variable conver_counts <- function(x){ q <- quantile(x) sect1 <- which(q[1] <= x & x<= q[2]) sect2 <- which(q[2 ]< x & x <= q[3]) sect3 <- which(q[3]< x & x <= q[4]) sect4 <- which(q[4]< x & x <= q[5]) x[sect1] <- 1 x[sect2] <- 2 x[sect3] <- 3 x[sect4] <- 4 return(x) } train <- apply(train,2,conver_counts) #naiveBayes m <- naiveBayes(train,train.label,laplace=1) pred <- predict(m,test,type="class") #comfusion matrix CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
可見對第一類(setosa)分類上預測錯誤率很高,這可能反映了樸素貝葉斯算法的缺點,對於處理大量數值特徵數據集時並不理想機器學習
library(C50) library(gmodels) set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train <- iris_rand[1:105,-5] test <- iris_rand[106:150,-5] train.label <- iris_rand[1:105,5] test.label <- iris_rand[106:150,5] #C50 m <- C5.0(train,train.label,trials = 10) pred <- predict(m,test,type="class") #comfusion matrix CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
library(RWeka) library(gmodels) set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train <- iris_rand[1:105,] test <- iris_rand[106:150,-5] test.label <- iris_rand[106:150,5] m <- OneR(Species ~ .,data=train) pred <- predict(m,test) CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
查看生成的規則,按照Petal的寬度,分紅三類,正確分類了105個裏面的101個
對於測試數據的混合矩陣以下
可見只使用了一個規則也能,也作到了不錯的效果ide
對於複雜的任務,只考慮單個規則可能過於簡單,考慮多個因素的更復雜的規則學習算法可能會有用,但也可能所以會變得更加難以理解。早期的規則學習算法速度慢,而且對於噪聲數據每每不許確,後來出現增量減小偏差修剪算法(IREP),使用了生成複雜規則的預剪枝和後剪枝方法的組合,並在案例從所有數據集分離以前進行修剪。雖然這提升了性能,可是仍是決策樹表現的更好。直到1995年出現了重複增量修剪算法(RIPPER),它對IREP算法進行改進後再生成規則,它的性能與決策樹至關,甚至超過決策樹。函數
library(RWeka) library(gmodels) set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train <- iris_rand[1:105,] test <- iris_rand[106:150,-5] test.label <- iris_rand[106:150,5] m <- JRip(Species ~ .,data=train) pred <- predict(m,test) CrossTable(pred,test.label,prop.r = F,prop.t = F,prop.chisq = F)
此次使用了三個規則,(Petal.Width >= 1.8爲virginica ,Petal.Length >= 3爲versicolor,其它爲setosa
可見雖然增長了規則可是並無提升模型的性能性能
迴歸主要關注一個惟一的因變量(須要預測的值)和一個或多個數值型自變量之間的關係。學習
x: 輸入矩陣,每列表示變量(特徵),每行表示一個觀察向量,也支持輸入稀疏矩陣(Matrix中的稀疏矩陣類);
y: 反應變量,對於gaussian或者poisson分佈族,是相應的量;對於binomial分佈族,要求是兩水平的因子,或者兩列的矩陣,第一列是計數或者是比例,第二列是靶向分類;對於因子來講,最後的水平是按照字母表排序的分類;對於multinomial分佈族,能有超過兩水平的因子。不管binomial或者是multinomial,若是y是向量的話,會強制轉化爲因子。對於cox分佈族,y要求是兩列,分別是time和status,後者是二進制變兩,1表示死亡,0表示截尾,survival包帶的Surv()函數能夠產生這樣的矩陣。對於mgaussian分佈族,y是量化的反應變量的矩陣;
family: 反應類型,參數family規定了迴歸模型的類型:family="gaussian"適用於一維連續因變量(univariate)family="mgaussian",適用於多維連續因變量(multivariate),family="poisson"適用於非負次數因變量(count),family="binomial"適用於二元離散因變量(binary),family="multinomial"適用於多元離散因變量(category)
weights: 權重,觀察的權重。若是反應變量是比例矩陣的話,權重是總計數;默認每一個觀察權重都是1;
offset: 包含在線性預測中的和觀察向量一樣長度的向量,在poisson分佈族中使用(好比log後的暴露時間),或者是對於已經擬合的模型的從新定義(將舊模型的因變量做爲向量放入offset中)。默認是NULL,若是提供了值,該值也必須提供給predict函數;
alpha: 彈性網絡混合參數,0 <= a <=1,懲罰定義爲(1-α)/2||β||_2^2+α||β||_1.其中alpha等於1是lasso懲罰,alpha等於0是ridge(嶺迴歸)的懲罰;
nlambda:lambda值個數;擬合出n個係數不一樣的模型
lambda.min.ratio:lambda的最小值,lambda.max的比例形式,好比所有係數都是0的時候的最小值。默認值依賴於觀察的個數和特徵的個數,若是觀察個數大於特徵個數,默認值是0.0001,接近0,若是觀察個數小於特徵個數,默認值是0.01。在觀察值個數小於特徵個數的狀況下,很是小的lambda.min.ratio會致使過擬合,在binominal和multinomial分佈族性,這個值未定義,若是解釋變異百分比老是1的話程序會自動退出;
lambda:用戶提供的lambda序列。一個典型的用法基於nlambada和lambda.min.ratio來計算自身lambda序列。若是提供lambda序列,提供的lambda序列會覆蓋這個。需謹慎使用,不要提供單個值給lambda(對於CV步驟後的預測,應使用predict()函數替代)。glmnet依賴於緩慢開始,而且它用於擬合全路徑比計算單個擬合更快;
standardize:對於x變量是否標準化的邏輯標誌,傾向於擬合模型序列。 係數老是在原有規模返回,默認standardize=TRUE。若是變量已是同一單位,你可能並不能獲得想要的標準化結果。
intercept:是否擬合截距,默認TRUE,或者設置爲0(FALSE)
thresh:座標降低的收斂域值,每一個內部座標降低一直進行循環,直到係數更新後的最大改變值比thresh值乘以默認變異要小,默認thresh爲1E-7;
dfmax:在模型中的最大變量數,對於大量的變量數的模型但咱們只須要部分變量時能夠起到做用;
pmax:限制非零變量的最大數目;
exclude:要從模型中排除的變量的索引,等同於一個無限的懲罰因子;
penalty.factor:懲罰因子,分開的懲罰因子可以應用到每個係數。這是一個數字,乘以lambda來容許不一樣的收縮。對於一些變量來講能夠是0,意味着無收縮,默認對所有變量是1,對於列在exlude裏面的變量是無限大。注意:懲罰因子是內部對nvars(n個變量)的和進行從新調整,而且lambda序列將會影響這個改變;
lower.limits:對於每一個係數的更低限制的向量,默認是無窮小。向量的每一個值須非正值。也能夠以單個值呈現(將會重複),或者是(nvars長度);
upper.limit:對於每一個係數的更高限制的向量,默認是無窮大;
maxit:全部lambda值的數據最大傳遞數;
type.gaussian:支持高斯分佈族的兩種算法類型,默認nvar < 500使用"covariance「,而且保留全部內部計算的結果。這種方式比"naive"快,"naive"經過對nobs(n個觀察)進行循環,每次內部計算一個結果,對於nvar >> nobs或者nvar > 500的狀況下,後者每每更高效;
type.logistic:若是是"Newton「,會使用準確的hessian矩陣(默認),當用的是"modified.Newton「時,只使用hession矩陣的上界,會更快;
standardize.response:這個參數時對於"mgaussian「分佈族來講的,容許用戶標準化應答變量;
type.multinomial:若是是"grouped",在多項式係數的變量使用分佈lasso懲罰,這樣能確保它們徹底在一塊兒,默認是"ungrouped"。
glmnet返回S3類,"glmnet","*","*"能夠是elnet,lognet,multnet,fishnet(poisson),merlnet
call:產生這個對象的調用;
a0:截距;
beta:對於elnet, lognet, fishnet和coxnet模型,返回稀疏矩陣格式的係數矩陣(CsparseMatrix),對於multnet和mgaussian模型,返回列表,包括每一類的矩陣;
lambda:使用的lambda值的實際序列;當alpha=0時,最大的lambda值並不僅僅等於0係數(原則上labda等於無窮大),相反使用alpha=0.01的lambda,由此導出lambda值;
dev.ratio:表示由模型解釋的變異的百分比(對於elnet,使用R-sqare)。若是存在權重,變異計算會加入權重,變異定義爲2x(loglike_sat-loglike),loglike_sat是飽和模型(每一個觀察值具備自由參數的模型)的log似然。所以dev.ratio=1-dev/nulldev;越接近1說明模型的表現越好
nulldev:NULL變異(每一個觀察值),這個定義爲2*(loglike_sat-loglike(Null));NULL模型是指截距模型,除了Cox(0 模型);
df:對於每一個lambda的非零係數的數量。對於multnet這是對於一些類的變量數目;
dfmat:僅適用於multnet和mrelnet。一個包括每一類的非零向量數目的矩陣;
dim:係數矩陣的維度;
nobs:觀察的數量;
npasses:所有lambda值加和的數據的總的通量;
offset:邏輯變量,顯示模型中是否包含偏移;
jerr:錯誤標記,用來警告和報錯(很大部分用於內部調試驗)
而直接顯示的結果有三列,分別是df,%Dev (就是dev.ratio),lambda是每一個模型對應的λ值
predict(object,newx,s=NULL,type=c("link","reponse","coefficients","nonzero","class"),exact=FALSE,offset,...)
coef(object,s=NULL,exact=FALSE)
object:glmnet返回的對象;
newx:用來預測的矩陣,也能夠是係數矩陣;這個參數不能用於type=c(""coefficents","nonzero");
s:懲罰參數lambda的值,默認是用來建立模型的所有lambda值;
type:預測值的類型;"link」類型給"binomial",「multinomial","poisson"或者"cov"模型線性預測的值,對於"gaussian」模型給擬合值。"response"類型,對於"binominal「和"multinomial」給擬合的機率,對於"poisson「,給擬合的均值,對於"cox",給擬合的相對未及;對於"gaussion",response等同於"link「類型。"coefficients"類型對於需求的s值計算係數。注意,對於"binomial」模型來講,結果僅僅對因子應答的第二個水平的類返回。「class"類型僅僅應用於"binomial」和"multinomial「模型,返回最大可能性的分類標籤。"nonzero」類型對每一個s中的值返回一個列表,其中包含非0參數的索引;
exact:這個參數僅僅對於用於預測的s(lambda)值不一樣於原始模型的擬合的值時,這個參數起到做用。若是exact=FALSE(默認),預測函數使用線性解釋來對給的s(lambda)值進行預測。這時一個很是接近的結果,只是稍微有點粗糙。若是exact=TRUE,這些不一樣的s值和擬合對象的lambda值進行sorted和merged,在做出預測以前進行模型的從新擬合。在這種狀況下,強烈建議提供原始的數據x=和y=做爲額外的命名參數給perdict()或者coef(),predict.glmnet()須要升級模型,而且指望用於建立接近它的數據。儘管不提供這些額外的參數它也會運行的很好,在調用函數中使用嵌套序列極可能會中斷。
offset:若是使用offset參數來擬合,必須提供一個offset參數來做預測。除了類型"coefficients"或者"nonzero「
...:能夠提供參數其它參數的機制,好比x=when exact=TRUE,seeexact參數。
library(glmnet ) library(psych) #dummy variable encoding iris$issetosa <- ifelse(iris$Species=="setosa",1,0) iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0) iris_dt <- iris[,-5] pairs.panels(iris_dt) #scatterplot matrix
pairs.panel畫出散點圖矩陣,對角線上方顯示的是變量之間的相關係數,每一個散點圖中呈橢圓形的對象稱爲相關橢圓,它提供一種變量之間是如何密切相關的可視化信息。位於橢圓中間的的點表示x軸變量和y軸變量的均值所肯定的點。兩個變量之間的相關性由橢圓的形狀表示,橢圓越被拉伸,其相關性就越強。散點圖中繪製的曲線稱爲局部迴歸平滑,它表示x軸和y軸變量之間的通常關係。iris數據畫出的散點圖矩陣中的相關係數和散點圖曲線均可見Petal.Length和Petal.Width有着強的相關性,而從散點圖曲線也可看出,彷佛Sepal.Length超出必定閾值後,Sepal.Length增長,Petal.Length也增長,而且也和品種是setosa或者versicolor也有關係。以Petal.Width做爲因變量做線性迴歸。
library(glmnet ) #dummy variable encoding iris$issetosa <- ifelse(iris$Species=="setosa",1,0) iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0) #divided into training sets and test sets set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train <- iris_rand[1:105,-c(4,5)] test <- iris_rand[106:150,-c(4,5)] train_value <- iris_rand[1:105,4] test_value <- iris_rand[106:150,4] #lasso m_lasso <- glmnet(as.matrix(train),train_value,family = "gaussian") plot(data.frame(df=m_lasso$df,dev.ratio=m_lasso$dev.ratio),type="b",cex=0.6) coef(m_lasso, s=0.0497000) #min df
查看變量個數與模型解釋變異百分比的點圖,發如今df=1時已經開始平緩,已經能夠解釋93%的變異。所以取df=1的能夠解釋最大變異的lambda,0.0452800,查看係數發現使用了兩個特徵,其中一個係數很是低,並非咱們須要的,所以lambda改成第二個解釋最大變異的lambda,0.0497000.
用coef取出參數以下
lambda=0.0452800
lambda=0.0497000
用選出的lambda值進行預測
pred <- predict(m_lasso,newx=as.matrix(test),s=0.0497000) summary(pred) summary(test_value) cor(test_value,pred) MAE <- mean(abs(pred - test_value)) mean(abs(mean(train_value) - test_value))
發現預測值和真實值範圍很是接近
相關係數高
MAE(平均絕對偏差,反映預測值和真實值的差距)僅爲0.1981803,若是隻是拿訓練集的均值預測的話,MAE高達0.6551746)
綜合以上的度量標準,說明咱們的模型預測的不錯。
library(rpart) library(RWeka) library(rpart.plot) #dummy variable encoding iris$issetosa <- ifelse(iris$Species=="setosa",1,0) iris$isversicolor <- ifelse(iris$Species=="versicolor",1,0) #divided into training sets and test sets set.seed(12345) #set random seed in order to repeat the result iris_rand <- iris[order(runif(150)),] train_dt <- iris_rand[1:105,-5] test <- iris_rand[106:150,-c(4,5)] test_value <- iris_rand[106:150,4] #rpart m.rpart <- rpart(Petal.Width ~ Sepal.Length+Sepal.Width+Petal.Length+issetosa+isversicolor,data = train_dt) summary(m.rpart) rpart.plot(m.rpart) pred <- predict(m.rpart,test) cor(test_value,pred) mean(abs(pred - test_value)) #rpart MAE mean(abs(mean(train_dt$Petal.Width) - test_value)) #mean MAE #M5P m.M5P <- M5P(Petal.Width ~ Sepal.Length+Sepal.Width+Petal.Length+issetosa+isversicolor,data = train_dt) summary(m.M5P) pred <- predict(m.M5P,test) cor(test_value,pred) mean(abs(pred - test_value)) #rpart MAE mean(abs(mean(train_dt$Petal.Width) - test_value)) #mean MAE
迴歸樹的結果以下
rpart.plot結果
相關性到達0.9797762,迴歸樹(MAF0.1242998)明顯比直接用均值預測(MAF0.7255238)更接近於真實的Petal.Width
模型樹的結果以下
相關係數到達0.9714331,MAF0.1410668,在這個模型樹中,只有一個根節點,相應創建了一個線性模型,直接用Sepal.Length ,Sepal.Width ,Petal.Length三個特徵進行預測,和lasso迴歸模型同樣,特徵前面的係數表明該特徵對Petal.Width的靜影響,注意,這裏的淨影響是指在當前節點這個線性模型中的淨影響,在這個線性模型中,每增長一點Sepal.Width和Petal.Length,Petal.Width都會增長,而係數小於0的Sepal.Length ,意味着每增長一點Sepal.Length,Petal.Width就會減小。從結果能夠看出,在這個案例中,模型樹沒有迴歸樹的效果好。
此處模型樹在沒有生成多個樹節點的狀況下,只是對特徵作了線性迴歸,MAF達到0.1410668,和以前對數據做線性迴歸的lasso模型結果(MAF0.1981803)相比,貌似作的更好,但其實以前的lasso迴歸模型咱們限制了特徵值個數來避免過擬合,若是增長特徵值數量和調整labda參數,同樣能夠達到比較小的MAF。
本文主要講了機器學習的一些基本概念,還有部分機器學習方法的基本原理及R語言實現。包括用於分類的機器學習方法:k近鄰,樸素貝葉斯,決策樹,規則學習;用於數值預測的機器學習方法:lasso迴歸,迴歸樹,模型樹,它們都屬於監督學習。下篇文章會說到監督學習中的神經網絡和支持向量機,還有其餘非監督學習的一些方法。
本文能夠做爲一個速查和簡單的入門,一些函數只列舉了部分重要的參數,具體的使用參數能夠經過查看R裏面的幫助得到。另外若是要用於實踐,還須要瞭解一些K折交叉檢驗,kappa統計量,ROC曲線內容,以對模型的性能進行評價和對不一樣的模型進行對比。
Brett Lantz:機器學習與R語言
薛毅,陳立萍: 統計建模與R軟件(下冊)
侯澄鈞:熱門數據挖掘模型應用入門(一): LASSO : https://cosx.org/2016/10/data-mining-1-lasso
slade_sha的博客 Lasso算法理論介紹 :http://blog.csdn.net/slade_sha/article/details/53164905