怎麼學慣用 R 語言進行數據挖掘?

把《R語言編程藝術》看了一遍,主要想用R來做數據挖掘,不知道下一步該怎麼學習了


瀉藥,

推廣一下cos論壇,COS論壇 | 統計之都,學R的人去看看瞬間就覺得不再孤單了,當然,論壇回復率和活躍度值得商榷,我頗有意見,但是考慮到R語言的小眾性,還是表示理解。。

R語言是一門學術性語言,我認為工程使用量不如學術使用量大,恰好最近我也在逐步熟悉操作,介紹學習R語言的幾個資料幾個牛人,英文的不用說了,官網足夠,中文的有比如,153分鐘學會R,R Reference Card, R語言環境下的文本挖掘這是劉思喆@貝吉塔行星總結的幾個文本,內容非常非常好,順便敬仰一下前輩,Rweibo | Lijian"s Homepage是另一位大牛, 開發的Rweibo瞬間讓你從不知道可以做什麼轉向可以做實施的方向,在此感謝一下

接下來,R語言就是工具了,如果你和我一樣懶,可以使用RStudio作為IDE,因為幫助內容很豐富,你可以install一個Rweibo的library就開始看有什麼可以做的,有什麼還不能做的

有什麼問題可以和我一起研究,歡迎之至,介紹完工具,再說數據挖掘:

你想用R來做數據挖掘,你需要做的第一件事情就是,你想拿什麼數據做什麼?為什麼說rweibo很好,因為微博有模式有數據,你就容易想到要做什麼,當然你也可以用corpus.JSS.papers包,iris數據集等等,問題是,你得想好你要拿什麼數據做什麼事。

當你選好數據和目的後,你就可以開始學習data mining了

這時要做的就是建模&<-「你準備怎麼做」,(可以用R來觀察數據,summary等函數都是很好用的),如果你想好了,比如,ETL是怎麼操作的,你就可以開始著手用R作為工具來做了,凡是你想的到的演算法,基本都有成型的庫了,去cran上面查查看,一定有資料的,慢慢的,熟練了,開始從無到有的提高吧...

共勉


昨天圍觀了在一個問題下的兩伙人掐架,深深感受到了因不同需求而導致觀點上的分歧真的可以器質性地不可調和。如果下面的回答不是題主希望想看到的那類,就當是給其他答案做一個有分歧意義的補充。

首先,我認為,想做好數據挖掘工作應該先著眼於學習理論知識,並且不間斷學習。學習的方法有很多,不一定是非要給自己安排讀 papers 的任務不可。如果數據挖掘就是日常工作或其中的一項,實際操作中不斷發現問題總結問題的同時還有機會開啟新的學習點,那真是再好不過。否則就真的要強迫自己在工作之餘主動學習了,比如給自己安排讀 papers 的任務、去論壇了解新的話題,等等。

再其次的關注點才輪到實際應用。善用可以利用的一切資源。有包就用包,有不會的馬上去 stackoverflow 問,甚至懶到去抓現成的 code 來用,只要真懂自己在做什麼,都沒關係。技術上的問題自己解決不了的還可以靠別人,技術背後的就真沒人能幫了。

我就想說這兩點,說完了。

第二次分享這本神作:Elements of Statistical Learning: data mining, inference, and prediction.
2nd Edition. 網頁還提供了書中用到的數據和一些 R 函數,很適合邊看邊學。


很簡單也不簡單的問題。

之前回答過類似的問題,有興趣建議抽出時間看一看:

  • 怎麼培養數據分析的能力?

  • 如何系統地學習數據挖掘?

如果說數據挖掘是一門手藝,那麼R語言就是工匠手裡一種工具,要做出一件價值連城的藝術品需要先「利其器」,但更關鍵的是工匠能夠「集百家之長,成一家之言「自成一派的創造力。

正所謂」操千曲而後曉聲,觀千劍而後識器"。建議初學者先了解一些機器學習的基礎理論以及典型的應用領域實例,定下自己想要研究的方向後與行業相結合,然後再學習工具的使用。

R語言經典圖書推薦:

  • 《R in Action-Data Analysis and Graphics with R》鏈接:R語言實戰 (豆瓣)

這本書從實用的統計研究角度,每一章節結合實際的例子講解了R在創建數據集、繪製圖形、數據管理、以及模型構建的使用方法,堪稱經典。前兩部分屬於R基本功能介紹,第三部分以後才是精髓開始(包括了回歸分析、方差分析、功效分析、廣義線性模型、主成分和因子分析等統計方法詳細的實例分析)。

  • 《數據之魅-基於開源工具的數據分析》鏈接:數據之魅 (豆瓣)

作者是華盛頓大學理論物理學博士。這本書是數據分析系列著作的經典之一,包含大量的R語言模擬過程及結果展示,例舉了很多數據分析實例和代碼。吃透以後就能夠對整個數據挖掘的流程有一個全方位的了解。

以上如有需要再補充,祝挖掘快樂。


有些小馬虎的地方,比如:案例3中,測試集的train_Num前面應該有個負號的,否則就也成訓練集了====2016.1.28日重新補充購物籃關聯分析apriori演算法====2016.1.20補充adaboost演算法案例=======2015.11.18日補充logistic建模案例(感興趣的可以深入研究下logistic這個案例,實際問題,挺有意思的) 11.19日增加k-means聚類結果繪圖========

前幾天寫過的一些東西,關於 R數據挖掘基礎操作及演算法應用 的一些 簡單案例(實際問題要比這些案例複雜很多,數據清洗、模型選擇、調參等等,每一環節都很重要且複雜),分享出來,希望對各位知友有幫助!

暫時貼出已寫完的這幾個,其它的一些經典演算法案例會不斷更新……

1、logistic回歸建模

程序代碼

###Logistic回歸建模
####案例:能否入選全明星?

##讀取並查看數據集
library(xlsx)
nba=read.xlsx("nba2013.xlsx",sheetIndex=1,header=T)
names(nba) #列名
n=dim(nba);n #481*32
str(nba) #查看數據集內部結構
nba$allstar&<-as.factor(nba$allstar) nba1&<-nba[,c(2,3,8,11,14,24,25,26,29,32)] #根據實際挑取某些變數 #names(nba1) ##下面:為分類變數pos(球員司職)創建指示變數並構造新的數據集 m1=rep(1,n[1]) #創建481個1 m0=rep(0,n[1]) table(nba1$pos) #分類有:C(中鋒)、PF(大前鋒)、PG(控衛)、 #SF(小前)、SG(分衛)、F(實際不存在) nba1$posC=ifelse(nba1$pos=="C",m1,m0) #條件成立為v1,否則為v0 nba1$posPF=ifelse(nba1$pos=="PF",m1,m0) nba1$posPG=ifelse(nba1$pos=="PG",m1,m0) nba1$posSF=ifelse(nba1$pos=="SF",m1,m0) nba1$posSG=ifelse(nba1$pos=="SG",m1,m0) #names(nba1) nba2&<-nba1[,-1] #刪去原pos變數 #str(nba2) ##下面:用全部數據進行logistic擬合 glm_model=glm(allstar~.,family=binomial,nba2) summary(glm_model) ##結果不是很好。下面:根據AIC指標,逐步回歸進行變數篩選 step(glm_model) #結果公式:allstar~age+fg+x3p+ast+blk+pts names(nba2) nba3&<-nba2[,c(1,2,3,5,7,8,9)] #根據上面結果選取最終變數 ##構造訓練集測試集 set.seed(123) #隨機數種子 n1=sample(dim(nba3)[1],floor(dim(nba3)[1]*0.69));n1 trainNBA&<-nba3[n1,] #訓練集 testNBA&<-nba3[-n1,] #測試集 ##使用訓練集建模 ModelFit&<-glm(allstar~.,family=binomial,trainNBA) summary(ModelFit) trainPre&<-predict(ModelFit,trainNBA,type="response") #訓練集預測 trainPre1&<-rep(0,dim(trainNBA)[1]) trainPre1[trainPre&>0.5]=1 #trainPre大於0.5,則生成1
table(trainNBA$allstar,trainPre1)
paste(round(mean(trainNBA$allstar==trainPre1)*100,2),"%",sep="")
#訓練集預測正確率

##測試集用來做預測
testPre&<-predict(ModelFit,testNBA,type="response") #測試集預測 testPre1&<-rep(0,dim(testNBA)[1]) testPre1[testPre&>0.5]=1
table(testNBA$allstar,testPre1)
paste(round(mean(testNBA$allstar==testPre1)*100,2),"%",sep="")
#測試集預測正確率

運行結果(部分)

&> summary(glm_model)

Call:
glm(formula = allstar ~ ., family = binomial, data = nba2)

Deviance Residuals:
Min 1Q Median 3Q Max
-1.6821 -0.1099 -0.0373 -0.0163 3.6923

Coefficients: (1 not defined because of singularities)
Estimate Std. Error z value Pr(&>|z|)
(Intercept) -2.162e+01 1.683e+03 -0.013 0.98975
age 1.733e-01 9.174e-02 1.889 0.05885 .
fg -1.960e-02 1.180e-02 -1.661 0.09673 .
x3p -9.500e-03 7.581e-03 -1.253 0.21020
x2p NA NA NA NA
ast 3.411e-03 3.675e-03 0.928 0.35333
stl 2.387e-03 1.275e-02 0.187 0.85151
blk 1.767e-02 9.600e-03 1.840 0.06575 .
pts 1.237e-02 4.675e-03 2.646 0.00814 **
posC 7.810e+00 1.683e+03 0.005 0.99630
posPF 7.672e+00 1.683e+03 0.005 0.99636
posPG 7.685e+00 1.683e+03 0.005 0.99636
posSF 6.607e+00 1.683e+03 0.004 0.99687
posSG 8.183e+00 1.683e+03 0.005 0.99612
---
Signif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1

(Dispersion parameter for binomial family taken to be 1)

Null deviance: 196.527 on 480 degrees of freedom
Residual deviance: 79.076 on 468 degrees of freedom
AIC: 105.08

Number of Fisher Scoring iterations: 15

&> ##結果不是很好。下面:根據AIC指標,逐步回歸進行變數篩選
&> step(glm_model) #結果公式:allstar~age+fg+x3p+ast+blk+pts
Start: AIC=105.08
allstar ~ age + fg + x3p + x2p + ast + stl + blk + pts + posC +
posPF + posPG + posSF + posSG

Step: AIC=105.08
allstar ~ age + fg + x3p + ast + stl + blk + pts + posC + posPF +
posPG + posSF + posSG

Df Deviance AIC
- posSF 1 79.076 103.08
- posPF 1 79.076 103.08
- posPG 1 79.076 103.08
- posC 1 79.076 103.08
- posSG 1 79.077 103.08
- stl 1 79.110 103.11
- ast 1 79.939 103.94
- x3p 1 80.741 104.74
& 79.076 105.08
- fg 1 82.141 106.14
- blk 1 82.213 106.21
- age 1 82.984 106.98
- pts 1 87.816 111.82

Step: AIC=103.08
allstar ~ age + fg + x3p + ast + stl + blk + pts + posC + posPF +
posPG + posSG

Df Deviance AIC
- stl 1 79.111 101.11
- posPG 1 79.579 101.58
- posPF 1 79.644 101.64
- posC 1 79.674 101.67
- ast 1 79.940 101.94
- posSG 1 80.675 102.67
- x3p 1 80.741 102.74
& 79.076 103.08
- fg 1 82.141 104.14
- blk 1 82.213 104.21
- age 1 82.984 104.98
- pts 1 87.816 109.82

Step: AIC=101.11
allstar ~ age + fg + x3p + ast + blk + pts + posC + posPF + posPG +
posSG

Df Deviance AIC
- posPG 1 79.581 99.581
- posPF 1 79.645 99.645
- posC 1 79.675 99.675
- ast 1 80.505 100.505
- posSG 1 80.698 100.698
- x3p 1 80.814 100.814
& 79.111 101.111
- fg 1 82.194 102.194
- blk 1 82.274 102.274
- age 1 83.088 103.088
- pts 1 87.935 107.935

Step: AIC=99.58
allstar ~ age + fg + x3p + ast + blk + pts + posC + posPF + posSG

Df Deviance AIC
- posPF 1 79.865 97.865
- posC 1 79.923 97.923
- posSG 1 80.699 98.699
- x3p 1 81.275 99.275
& 79.581 99.581
- blk 1 82.453 100.453
- fg 1 82.579 100.579
- age 1 83.239 101.239
- ast 1 83.534 101.534
- pts 1 88.103 106.103

Step: AIC=97.87
allstar ~ age + fg + x3p + ast + blk + pts + posC + posSG

Df Deviance AIC
- posC 1 79.960 95.960
- posSG 1 80.728 96.728
& 79.865 97.865
- x3p 1 82.133 98.133
- fg 1 82.707 98.707
- blk 1 83.275 99.275
- ast 1 83.600 99.600
- age 1 84.405 100.405
- pts 1 88.493 104.493

Step: AIC=95.96
allstar ~ age + fg + x3p + ast + blk + pts + posSG

Df Deviance AIC
- posSG 1 80.800 94.800
& 79.960 95.960
- x3p 1 82.633 96.633
- fg 1 83.013 97.013
- ast 1 83.682 97.682
- age 1 84.773 98.773
- blk 1 85.815 99.815
- pts 1 89.001 103.001

Step: AIC=94.8
allstar ~ age + fg + x3p + ast + blk + pts

Df Deviance AIC
& 80.800 94.800
- x3p 1 82.942 94.942
- ast 1 83.758 95.758
- fg 1 84.305 96.305
- blk 1 85.943 97.943
- age 1 86.048 98.048
- pts 1 90.692 102.692

Call: glm(formula = allstar ~ age + fg + x3p + ast + blk + pts, family = binomial,
data = nba2)

Coefficients:
(Intercept) age fg x3p ast blk
-14.052311 0.182476 -0.019873 -0.009723 0.003714 0.017605
pts
0.012472

Degrees of Freedom: 480 Total (i.e. Null); 474 Residual
Null Deviance: 196.5
Residual Deviance: 80.8 AIC: 94.8
&> names(nba2)
[1] "age" "fg" "x3p" "x2p" "ast" "stl" "blk" "pts"
[9] "allstar" "posC" "posPF" "posPG" "posSF" "posSG"
&> nba3&<-nba2[,c(1,2,3,5,7,8,9)] #根據上面結果選取最終變數 &> paste(round(mean(trainNBA$allstar==trainPre1)*100,2),"%",sep="")
[1] "97.28%"
&> #訓練集預測正確率

&> paste(round(mean(testNBA$allstar==testPre1)*100,2),"%",sep="")
[1] "95.33%"

###結果說明:訓練集及測試集預測正確率如上,分別為97.22%和94.21%,測試集相對訓練集預測
###正確率略低,感興趣的童鞋可調試下訓練集抽樣比例(劇透:我的在抽取0.69時結果最優),
###來找出最優結果。

寫在後面:簡單寫這麼多,算是拋磚引玉。從本案例可以看出,特徵的選擇對於模型很重要,感興趣的童鞋可以嘗試下其它特徵變數的選擇對於模型的影響;也可以試試其它演算法,從得到更好的模型及結果;順便,可以多採集些不同年份的數據,從業務層面去深入分析下。

另,對於想嘗試其它方法的童鞋,可進一步交流(我的微信:lhf_Peter,加微信索要數據吧,就不公開啦),相信這是一個比較實際而且很好玩的事情!

2、K-means聚類

程序代碼

#K-means聚類
#案例:iris鳶尾花聚類
library(cluster) #載入包
library(useful) #載入該包,用於下面作圖
data(iris)
iris&<-iris dim(iris) #顯示數據維度 head(iris) #最後一列是鳶尾花的分類 table(iris$Species) #顯示iris數據集Species列中各個值出現的頻次 iris_new&<-iris[,-5];head(iris_new) #去掉最後一列 irisK3&<-kmeans(iris_new,3);irisK3 #進行k-means聚類。注意:實際問題中注意k的取值 t=table(iris$Species,irisK3$cluster);t #查看聚類結果 plot(irisK3,iris,class="Species") #將聚類結果與鳶尾花初始類別繪製在一個圖進行比對

運行結果

&> irisK3&<-kmeans(iris_new,3);irisK3 #進行k-means聚類 K-means clustering with 3 clusters of sizes 50, 38, 62 Cluster means: Sepal.Length Sepal.Width Petal.Length Petal.Width 1 5.006000 3.428000 1.462000 0.246000 2 6.850000 3.073684 5.742105 2.071053 3 5.901613 2.748387 4.393548 1.433871 Clustering vector: [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [33] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 [65] 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 [97] 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2 2 2 2 3 2 3 2 3 2 2 3 3 [129] 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2 2 3 Within cluster sum of squares by cluster: [1] 15.15100 23.87947 39.82097 (between_SS / total_SS = 88.4 %) Available components: [1] "cluster" "centers" "totss" "withinss" [5] "tot.withinss" "betweenss" "size" "iter" [9] "ifault" &> t=table(iris$Species,irisK3$cluster);t

1 2 3
setosa 50 0 0
versicolor 0 2 48
virginica 0 36 14

##觀察上面結果可知,聚類結果還不錯

作圖結果:

3、決策樹模型

程序代碼

#決策樹模型
#案例:iris鳶尾花分類
library(rpart) #載入包
data(iris)
iris&<-iris dim(iris) n1=floor(0.8*dim(iris)[1]);n1 train_Num=sample(1:dim(iris)[1],n1) train=iris[train_Num,] #訓練集 test=iris[train_Num,] #測試集 #使用訓練集建模 dtmodel=rpart(Species~.,method="class",train) dtmodel train_Pre=predict(dtmodel,train,type="class") t=table(train$Species,train_Pre);t train_accuracy=round((t[1,1]+t[2,2]+t[3,3])/sum(t),digits=2);train_accuracy #訓練接預測正確率 #測試集 test_Pre=predict(dtmodel,test,type="class") tt=table(test$Species,test_Pre);tt test_accuracy=round((tt[1,1]+tt[2,2]+tt[3,3])/sum(tt),digits=2);test_accuracy #測試集預測正確率

運行結果

&> t=table(train$Species,train_Pre);t
train_Pre
setosa versicolor virginica
setosa 41 0 0
versicolor 0 38 1
virginica 0 4 36
&> train_accuracy=round((t[1,1]+t[2,2]+t[3,3])/sum(t),digits=2);train_accuracy
[1] 0.96
&> #訓練接預測正確率
&>
&> #測試集
&> test_Pre=predict(dtmodel,test,type="class")
&> tt=table(test$Species,test_Pre);tt
test_Pre
setosa versicolor virginica
setosa 41 0 0
versicolor 0 38 1
virginica 0 4 36
&> test_accuracy=round((tt[1,1]+tt[2,2]+tt[3,3])/sum(tt),digits=2);test_accuracy
[1] 0.96
&> #測試集預測正確率

4、文本挖掘基礎(按說這個該放在最後,後續補充案例之後再修改順序

程序代碼

#文本分詞正則
#案例:《笑傲江湖》文本基礎分析
setwd("E:/Rwd_All")
library(jiebaR) #載入分詞包,牆裂推薦jiebaR包
engine&<-worker() #根據默認參數建立分詞引擎 ##下面讀取txt文本 xajh&<-read.table("C:\Users\Administrator\Desktop\金庸-笑傲江湖.txt", sep=" ",header=F,colClasses="character") #讀取《笑傲江湖》txt文件 head(xajh) #查看錶頭 xajh$V1[c(1:5,5000:5005,20000:20005)] #隨便查看部分內容 ##下面進行文本分詞 words&<-engine&<=xajh$V1 #分詞 words1&<-unlist(words) words1&<-words[words!=""] w1=words1[nchar(words1)==1];w1 #查看一個字的詞(w1)有沒有分析價值 sort(table(w1),decreasing=T)[1:50] #輸出前50個出現頻率最高w1 #注:不做深入分析,忽略掉這些單字的語氣詞、代詞、動詞、形容詞等 words2&<-words1[nchar(words1)&>1 nchar(words1)&<7] #只要字元創長度介於2-6的詞 wordFreq25=sort(table(words2),decreasing=T)[1:25];wordFreq25 #輸出前25個高頻詞 library(wordcloud) #載入包,做詞雲圖用 wordcloud(names(wordFreq25),wordFreq25,min.freq=2,random.order=F,random.color=T,colors = c(1:25)) #詞雲圖繪製較簡單,參數使用文檔介紹的很詳細,我就不羅嗦了!做個機智的「調包俠」lol…… ##下面抓取令狐沖和盈盈的對話 沖盈&<-xajh$V1[grepl("沖哥|令狐沖|令狐少俠|令狐公子",xajh$V1) grepl("盈盈|婆婆|姑姑|聖姑|任盈盈|任小姐",xajh$V1) grepl("「|」",xajh$V1)] n=sample(1:length(沖盈),20);n sents=沖盈[n];sents #隨機抽看沖盈對話的20句 ##第二個就是最喜歡的風清揚前輩了,這次抽出跟風清揚相關的所有內容 風清揚&<-xajh$V1[grepl("風清揚|風老前輩|風太師叔|獨孤九劍",xajh$V1)] 風清揚[1:20] #查看前20相關的內容 ##保存自己喜歡的小說內容至txt文件 write.table(沖盈,"沖盈.txt") write.table(風清揚,"風清揚.txt")

運行結果

#僅貼出部分運行結果
&> wordFreq25=sort(table(words2),decreasing=T)[1:25];wordFreq25 #輸出前25個高頻詞
words2
令狐沖 甚麼 說道 自己 岳不群 一個 師父 盈盈 劍法 弟子 林平之 岳靈珊 咱們 一聲 不是 恆山 他們
4728 2053 1580 1166 1117 1041 993 974 964 934 871 866 861 824 762 752 739
長劍 田伯光 不知 出來 之中 教主 師妹 心中
729 662 646 643 580 574 570 569
&> sents=沖盈[n];sents #隨機抽看沖盈對話的20句
[1] "將胸膛挺了挺。盈盈道:「你死在臨頭,還笑甚麼?」令狐沖" "令狐沖驚喜交集,情不自禁的衝口而出:「盈盈來了!」急"
[3] "令狐沖一坐定後,便問:「聖姑到底怎樣啦?這可急死我" "盈盈道:「不用心急,要救兩個人,總還辦得到。」令狐沖知"
[5] "令狐沖道:「多謝大師好意,待晚輩護送婆婆到達平安的" "令狐沖和盈盈同時叫道:「不好!」從高粱叢中躍了出來。"
[7] "就叫我學他的樣。」那婆婆道:「正是。」令狐沖笑道:「天下" "盈盈道:「沖哥,這華山之上,有一處地方和你大有干係,"
[9] "聽,不許隱瞞抵賴。」盈盈道:「不上來!好沒正經。」令狐沖" "令狐沖向盈盈道:「盈盈,你是不能隨我去的了?」盈盈"
[11] "盈盈眼光中閃出喜悅的光芒,道:「沖哥,你這是真心話" "盈盈道:「定閑師太是為了女兒而死的。」令狐沖向她瞧"
[13] "令狐沖笑道:「從此之後,我不叫你婆婆了,那我叫你甚" "那婆婆道:「我仔細想想,要令狐沖這小子拋了你,另娶"
[15] "盈盈與令狐沖並肩緩緩回見性峰來,說道:「東方不敗此" "活呢。」盈盈道:「你這話可不是騙我?」令狐沖道:「就怕我"
[17] "令狐沖驚道:「我師父斷了腿骨?」盈盈微笑道:「沒震死" "盈盈急道:「你不能走。」令狐沖道:「為甚麼?」盈盈道:"
[19] "令狐沖和盈盈都暗暗點頭,心道:「左冷禪和勞德諾所以" "那婆婆叫道:「喂,喂,你怎麼啦?」令狐沖臉上、手上"
&>
&> ##第二個就是最喜歡的風清揚前輩了,這次抽出跟風清揚相關的所有內容
&> 風清揚&<-xajh$V1[grepl("風清揚|風老前輩|風太師叔|獨孤九劍",xajh$V1)] &> 風清揚[1:20] #查看前20相關的內容
[1] "「風清揚」三個大字,是以利器所刻,筆劃蒼勁,深有半寸," "尋思:「這位風清揚是誰?多半是本派的一位前輩,曾被罰在"
[3] "石壁之上。令狐沖見到壁上「風清揚」三個大字,伸出手指," "風清揚風老前輩!」"
[5] "令狐沖登時想起石壁上所刻的那「風清揚」三個大字,忍" "風……」他想「風清揚」的名字中有個「清」字,那是比師"
[7] "父「不」字輩高了一輩的人物,接著道:「風太師叔歸隱多年," "夕之間盡數暴斃,只有風清揚一人其時不在山上,逃過了這"
[9] "過的,雖有你風太師叔不斷指點,終歸無用。你還是乖乖的" "巧法?田伯光提到風清揚,便真有一個風清揚出來。」"
[11] "白送在你手裡?」轉面向那老者道:「風老前輩,田伯光是後" "前輩風太師叔,實是萬千之喜。」"
[13] "那老者風清揚道:「你起來。」令狐沖又恭恭敬敬的磕了" "去取。風清揚搖頭道:「不用!」眯著眼向太陽望了望,輕聲"
[15] "風清揚向縮在地下的田伯光瞧了一眼,話道:「他給你戳" "風清揚搖搖頭,說道:「你是岳不群的弟子,我本不想傳"
[17] "風清揚指著石壁說道:「壁上這些華山派劍法的圖形,你" "只聽風清揚續道:「岳不群那小子,當真是狗屁不通。你"
[19] "風清揚一怔,已明其理,淡淡的道:「他要是不肯呢?你" "不殺自己,自己又怎能一佔上風,卻便即殺他?風清揚道:"

詞雲圖:

男主出鏡率當仁不讓了……

輸出文件截圖示例:

之所以保存部分小說內容,完全是因為:像我這樣資深級的偽笑傲迷,電視劇看了N遍,想看原小說卻一直沒行動的人,沖盈之間的打情罵俏及風清揚這種神級人物的所言所行是值得保存下來細細品味的。

5、關聯規則apriori演算法

為防止頁面太長,寫在專欄裡面了,請見http://zhuanlan.zhihu.com/lhf-data/20537735

6、機器集成學習的AdaBoost演算法

已發專欄,請見: http://zhuanlan.zhihu.com/lhf-data/20517167

待補充:

7、隨機森林演算法

8、SVM

9、神經網路

先貼出這幾個,順序也有些亂(上面案例4也說了,該案例純屬為了好玩,本人是骨灰級笑傲迷),不過這是目前我寫完的內容!後面的一些演算法應用,待我寫完之後會繼續更新(可能會慢一點 ̄へ ̄)!!!

轉載請聯繫我微信!


An introduction to Statistical Learning with Application in R

Introduction to Statistical Learning

還有配套視頻


首先歡迎大家關注我的專欄:R語言與數據挖掘 - 知乎專欄

########寫了好多代碼,累了,有贊我再繼續############

之前有幸在Stanford Summer選修了data mining的課程。就是基於R語言的。

參考書為 Introduction to Statistical Learning

這本書淺顯易懂,非常適合初學者,包含以下內容:

  1. 數據挖掘基礎知識,比如the bias-variance trade off
  2. 線性回歸
  3. 各種分類器:logistics regression, LDA, QDA, KNN, Naive Bayes, SVM, Decision Tree, Random Forest, Boosting, Ada boosting等。
  4. 模型選擇Model Selection(前向、後向、Ridge、Lasso、主成分分析PCA)
  5. 再抽樣辦法Resampling Methods(cross validation交叉檢驗、boostrap)

基本學完了以後,可以勝任基於R語言的數據挖掘與數據分析的工作了。

而且這本書最大的好處是,包括了大量的源代碼,可以直接照貓畫虎的學習R中各種包,進步迅速。下面將是我自己總覺得大量代碼預警:

  • 數據觀察與logistics regression

######################載入數據、觀察數據########################
library(ISLR) #載入ISLR包,這個包里有Weekly這個現成的數據集
summary(Weekly)

## Year Lag1 Lag2 Lag3
## Min. :1990 Min. :-18.195 Min. :-18.195 Min. :-18.195
## 1st Qu.:1995 1st Qu.: -1.154 1st Qu.: -1.154 1st Qu.: -1.158
## Median :2000 Median : 0.241 Median : 0.241 Median : 0.241
## Mean :2000 Mean : 0.151 Mean : 0.151 Mean : 0.147
## 3rd Qu.:2005 3rd Qu.: 1.405 3rd Qu.: 1.409 3rd Qu.: 1.409
## Max. :2010 Max. : 12.026 Max. : 12.026 Max. : 12.026
## Lag4 Lag5 Volume Today
## Min. :-18.195 Min. :-18.195 Min. :0.087 Min. :-18.195
## 1st Qu.: -1.158 1st Qu.: -1.166 1st Qu.:0.332 1st Qu.: -1.154
## Median : 0.238 Median : 0.234 Median :1.003 Median : 0.241
## Mean : 0.146 Mean : 0.140 Mean :1.575 Mean : 0.150
## 3rd Qu.: 1.409 3rd Qu.: 1.405 3rd Qu.:2.054 3rd Qu.: 1.405
## Max. : 12.026 Max. : 12.026 Max. :9.328 Max. : 12.026
## Direction
## Down:484
## Up :605
##
##
##
pairs(Weekly) #兩兩變數的配對圖

cor(Weekly[, -9]) #看不同變數的相關性
## Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume
## Year 1.00000 -0.032289 -0.03339 -0.03001 -0.031128 -0.030519 0.84194
## Lag1 -0.03229 1.000000 -0.07485 0.05864 -0.071274 -0.008183 -0.06495
## Lag2 -0.03339 -0.074853 1.00000 -0.07572 0.058382 -0.072499 -0.08551
## Lag3 -0.03001 0.058636 -0.07572 1.00000 -0.075396 0.060657 -0.06929
## Lag4 -0.03113 -0.071274 0.05838 -0.07540 1.000000 -0.075675 -0.06107
## Lag5 -0.03052 -0.008183 -0.07250 0.06066 -0.075675 1.000000 -0.05852
## Volume 0.84194 -0.064951 -0.08551 -0.06929 -0.061075 -0.058517 1.00000
## Today -0.03246 -0.075032 0.05917 -0.07124 -0.007826 0.011013 -0.03308
## Today
## Year -0.032460
## Lag1 -0.075032
## Lag2 0.059167
## Lag3 -0.071244
## Lag4 -0.007826
## Lag5 0.011013
## Volume -0.033078
## Today 1.000000

######################用logistics Regression建模########################
##
## Call:
## glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
## Volume, family = binomial, data = Weekly)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.695 -1.256 0.991 1.085 1.458
##
## Coefficients:
## Estimate Std. Error z value Pr(&>|z|)
## (Intercept) 0.2669 0.0859 3.11 0.0019 **
## Lag1 -0.0413 0.0264 -1.56 0.1181
## Lag2 0.0584 0.0269 2.18 0.0296 *
## Lag3 -0.0161 0.0267 -0.60 0.5469
## Lag4 -0.0278 0.0265 -1.05 0.2937
## Lag5 -0.0145 0.0264 -0.55 0.5833
## Volume -0.0227 0.0369 -0.62 0.5377
## ---
## Signif. codes: 0 "***" 0.001 "**" 0.01 "*" 0.05 "." 0.1 " " 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1496.2 on 1088 degrees of freedom
## Residual deviance: 1486.4 on 1082 degrees of freedom
## AIC: 1500
##
## Number of Fisher Scoring iterations: 4

####可以看到lag2是顯著的

#############用得到的logistics模型預測########################
glm.probs = predict(glm.fit, type = "response")
glm.pred = rep("Down", length(glm.probs))
glm.pred[glm.probs &> 0.5] = "Up"
table(glm.pred, Direction)

## Direction
## glm.pred Down Up
## Down 54 48
## Up 430 557

  • QDA與LDA模型

################################LDA##########################
library(MASS)
lda.fit = lda(Direction ~ Lag2, data = Weekly, subset = train)
#用lda()函數生成LDA模型
lda.pred = predict(lda.fit, Weekly.0910)
table(lda.pred$class, Direction.0910)
## Direction.0910
## Down Up
## Down 9 5
## Up 34 56
mean(lda.pred$class == Direction.0910)
## [1] 0.625

##############################QDA###########################
qda.fit = qda(Direction ~ Lag2, data = Weekly, subset = train)
#用qda()函數生成QDA模型
qda.class = predict(qda.fit, Weekly.0910)$class
table(qda.class, Direction.0910)
## Direction.0910
## qda.class Down Up
## Down 0 0
## Up 43 61
mean(qda.class == Direction.0910)
## [1] 0.5865

  • KNN模型

library(class)
train.X = as.matrix(Lag2[train])
test.X = as.matrix(Lag2[!train])
train.Direction = Direction[train]
set.seed(1)
knn.pred = knn(train.X, test.X, train.Direction, k = 1)
#用knn()函數生成KNN模型,其中參數k為近鄰數量
table(knn.pred, Direction.0910)
## Direction.0910
## knn.pred Down Up
## Down 21 30
## Up 22 31
mean(knn.pred == Direction.0910)
## [1] 0.5

  • Bootstrap方法

library(MASS)
summary(Boston)
## crim zn indus chas
## Min. : 0.01 Min. : 0.0 Min. : 0.46 Min. :0.0000
## 1st Qu.: 0.08 1st Qu.: 0.0 1st Qu.: 5.19 1st Qu.:0.0000
## Median : 0.26 Median : 0.0 Median : 9.69 Median :0.0000
## Mean : 3.61 Mean : 11.4 Mean :11.14 Mean :0.0692
## 3rd Qu.: 3.68 3rd Qu.: 12.5 3rd Qu.:18.10 3rd Qu.:0.0000
## Max. :88.98 Max. :100.0 Max. :27.74 Max. :1.0000
## nox rm age dis
## Min. :0.385 Min. :3.56 Min. : 2.9 Min. : 1.13
## 1st Qu.:0.449 1st Qu.:5.89 1st Qu.: 45.0 1st Qu.: 2.10
## Median :0.538 Median :6.21 Median : 77.5 Median : 3.21
## Mean :0.555 Mean :6.29 Mean : 68.6 Mean : 3.79
## 3rd Qu.:0.624 3rd Qu.:6.62 3rd Qu.: 94.1 3rd Qu.: 5.19
## Max. :0.871 Max. :8.78 Max. :100.0 Max. :12.13
## rad tax ptratio black
## Min. : 1.00 Min. :187 Min. :12.6 Min. : 0.3
## 1st Qu.: 4.00 1st Qu.:279 1st Qu.:17.4 1st Qu.:375.4
## Median : 5.00 Median :330 Median :19.1 Median :391.4
## Mean : 9.55 Mean :408 Mean :18.5 Mean :356.7
## 3rd Qu.:24.00 3rd Qu.:666 3rd Qu.:20.2 3rd Qu.:396.2
## Max. :24.00 Max. :711 Max. :22.0 Max. :396.9
## lstat medv
## Min. : 1.73 Min. : 5.0
## 1st Qu.: 6.95 1st Qu.:17.0
## Median :11.36 Median :21.2
## Mean :12.65 Mean :22.5
## 3rd Qu.:16.95 3rd Qu.:25.0
## Max. :37.97 Max. :50.0
set.seed(1)
attach(Boston) #使用Boston數據集

boot.fn = function(data, index) return(mean(data[index]))
#先定義boot.fn函數
library(boot)
#boot是bootstrap包
bstrap = boot(medv, boot.fn, 1000)
#用boot()函數估計均值
bstrap
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = medv, statistic = boot.fn, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 22.53 0.008518 0.4119


學習數據挖掘光會用R里的package是不夠的。如果給你一個真實的dataset(不是書里給你做練慣用的數據),你怎麼選擇模型呢?

建議樓主先不要糾結於R語言怎麼用,而是先學習一下各個演算法的原理和優劣。都弄清楚了以後再選任意一門語言上手都是很容易的事情。建議的學習順序是:

linear regression

lasso/ridge/other regularized regression (根據自己的需要可以學習一下time series)

LDA

logistic regression

classification problems (tree, clustering, PCA, etc)

推薦一下這學期在上的一門課Data Mining (&<-鏈接). 練習都是用R做的。題主感興趣的話可以做一下course website上的練習。

(Edit: 學期結束後上面那個鏈接貌似被prof拿掉了(抱歉!),Data Mining (&<-鏈接). 這個是前兩年的data mining,作業也是用R做的。教授是Ryan Tibshirani, 大名鼎鼎的那個Tibshirani的兒子。課的內容應該有很多重複之處。


我覺得帶著問題、數據學習最快了。


R語言做學術研究非常方便。R做數據挖掘,推薦這個網站:

http://www.rdatamining.com/


統計建模的部分,前面各位已經講的很透徹了,本人在這裡做一點小小的補充,r軟體做數據挖掘的優勢不僅對大多數統計模型的支持,還在於強大的可視化功能和對不同網站api和各種外部軟體的支持。

PS:微軟最新發布的mran和sql server 都將使r支持並行處理,R對於大數據的支持將指日可待。

這裡有本人做的一個小實例供大家參考,不足之處還請指正交流(qq 570881451)

用r對twitter數據進行挖掘

專欄:拓端數據研究院

Twitter是一個流行的社交網路,這裡有大量的數據等著我們分析。Twitter R包是對twitter數據進行文本挖掘的好工具。 本文是關於如何使用Twitter R包獲取twitter數據並將其導入R,然後對它進行一些有趣的數據分析。

第一步是註冊一個你的應用程序。

為了能夠訪問Twitter數據編程,我們需要創建一個與Twitter的API交互的應用程序。

註冊後你將收到一個密鑰和密碼:

獲取密鑰和密碼後便可以在R裡面授權我們的應用程序以代表我們訪問Twitter:

根據不同的搜索詞,我們可以在幾分鐘之內收集到成千上萬的tweet。 這裡我們測試一個關鍵詞 littlecaesars的twitter結果:

抓取最新的1000條相關twitter

由於默認的抓取結果是json格式,因此使用twlisttodf函數將其轉換成數據框

然後我們做一些簡單的文本清理

從得到的數據里,我們可以看到有twitter發表時間,內容,經緯度等信息

在清理數據之後,我們對twitter內容進行分詞,以便進行數據可視化

分詞之後可以得到相關twitter的高頻辭彙,然後將其可視化

除此之外,還可以結合數據中的時間戳數據和地理數據進行可視化分析

如果你一直在考慮對一些文本數據應用情感分析,你可能會發現使用R比你想像的更容易!本文分享了使用twitterR的粗淺心得,有問題歡迎交流討論!(qq 570881451)

歡迎關注微信公眾號 拓端數據

搜狐認證公眾號:大數據部落格的個人展示頁


網上搜一下Rweibo


數據挖掘之R語言視頻教程

百度網盤地址:鏈接:http://pan.baidu.com/s/1dFmJ0D7 密碼:dzs0


數據挖掘的理論基礎和R也沒什麼太大關係。如果明白方法了,用什麼語言其實無所謂。不過R有幾個包,可以提升效率和彌補R自身的不足,做大數據很有用。我就說說我每天要用的吧。

bigmemory:R的內存管理太爛了,因為很少給程序員管理的許可權,這樣一來操作系統懶加上R也懶導致常常讀入大數據時內存瞬間用完,導致這個R session被強制退出。解決辦法就是把常用的大數據提前放在共享內存里。

Rmpi,snow,multicore: 平行運算/多運程運算。 Rmpi最好多看看,是mpi在R裡面的實現。這是平行運算的黃金標準。如果你要做大數據的模型,高能運算是必須的。

Rcpp:R與C++的介面。自帶的.C和.F也很有用。畢竟R是高等語言,太慢了,基本的方程還是要用低等語言寫。如果做統計模型,會有很多inference,這時必須要用低等語言寫Log likelihood的方程。

DEoptim,quadqrog,linprog等等線性非線性優化:優化是統計少不了的技術。R裡面好的優化包不是太慢就是太爛,你可以用GNU scientific library自己寫優化器,或者買一個第三方的比如說IBM。不過很貴哦,

ggplot:不多說了,就是美麗的圖片。。。

不是R的:hadoop。近幾年,這都是處理大數據的必需品了。

有了以上工具我相信任何數據和統計問題都能解決了,不會被R自身的缺陷而陷入技術瓶頸。


想要中文教程的話可以看一下數析學院(http://datacademy.io),裡面都是國人翻譯的免費課程,基本上夠用


初入門道的小白剛路過,深入沒底了,學習起來覺得沒底。


用R做文本情感極性分析,怎麼把分好的詞和情感詞配對並計算得分~~~救助大神!!!


最近一直在關注 一個叫FinanceR的專欄,作者更新速度很快,內容也是對的起業內良心呀。

鏈接在此,不要謝我!

FinanceR - SegmentFault


先學會R語言再搞懂什麼是數據挖掘然後學會R數據挖掘的那幾個包,多做一些數據挖掘的項目


&有人有中文版的嗎?裡面有R代碼


R還是很強大的,缺點就是數據量不能太大,想用活R還需要學習C++來編寫R的package。


推薦閱讀:

Python 是一門適合做數據挖掘的語言嗎?
隨機森林是否需要後剪枝?sklearn為什麼沒有實現這個功能,是否有人實現了這個功能?
聚類與分類有什麼區別?
數據挖掘SPSS,Python,《機器學習實戰》先學什麼好?
LDA訓練出主題之後,怎麼再通過主題計算出一篇文檔對於所有主題的分布呢?

TAG:編程語言 | 數據挖掘 | R編程語言 |