引言算法
R是一種普遍用於數據分析和統計計算的強大語言,於上世紀90年代開始發展起來。得益於全世界衆多 愛好者的無盡努力,你們繼而開發出了一種基於R但優於R基本文本編輯器的R Studio(用戶的界面體驗更好)。也正是因爲全世界愈來愈多的數據科學社區和用戶對R包的慷慨貢獻,讓R語言在全球範圍內愈來愈流行。其中一些R包,例如MASS,SparkR, ggplot2,使數據操做,可視化和計算功能愈來愈強大。sql
咱們所說的機器學習和R有什麼關係呢?我對R的第一印象是,它只是一個統計計算的一個軟件。可是後來我發現R有足夠的能力以一個快速和簡單的方式來實現機器學習算法。這是用R來學習數據科學和機器學習的完整教程,讀完本文,你將有使用機器學習的方法來構建預測模型的基本能力。編程
注:這篇文章對於以前沒有不少數據科學知識的同窗們是特別值得一看的,同時掌握必定的代數和統計知識將會更有益於您的學習。微信
目錄markdown
1、 初識R語言數據結構
一、 我爲何要學R?機器學習
二、 如何安裝R/R Studio?編輯器
三、 如何安裝R包?svg
四、 R中的一些基本計算函數
2、 編程基礎慨念及R包
一、 R中的數據類型和對象
二、 R中的控制語句簡介
三、 經常使用的R包
3、 用R進行數據預處理
一、 數據集中基本概念
二、 圖形展現
三、 缺失值處理
四、 連續性變量與分類變量的處理
五、 特徵變量計算
六、標籤編碼和獨熱編碼
4、 用機器學習的算法構建預測模型
一、 多元線性迴歸
二、 決策樹
三、隨機森林
1、初識R語言
一、爲何學R ?
事實上,我沒有編程經驗,也沒有學過計算機。可是我知道若是要學習數據科學,一我的必須學習R或Python做爲開始學習的工具。我選擇了前者,同時在學習過程當中我發現了一些使用R的好處:
二、如何安裝R / Rstudio?
你能夠https://www.r-project.org/官網下載並安裝R,須要注意的是R的更新速度很快,下載新版本的體驗會更好一些。
另外,我建議你從RStudio開始,由於RStudio的界面編程體驗更好一些。你能夠經過https://www.rstudio.com/products/rstudio/download/ 在「支持的平臺上安裝」部分中, 根據您的操做系統選擇您須要的安裝程序。點擊桌面圖標RStudio,就開始你的編程體驗,以下圖所示:
讓咱們快速的瞭解:一下R界面
三、如何安裝包?
R的計算能力在於它擁有強大的R包。在R中,大多數數據處理任務能夠從兩方面進行,使用R包和基本功能。在本教程中,咱們將介紹最方便的和強大的R包。特別的,通常不太建議直接在R軟件的中直接安裝加載包,由於這樣可能會影響你的計算速度。咱們建議你直接在R的官網上下載好您所須要的R包,經過本地安裝的形式進行安裝,以下:
在軟件中安裝:install.packages(「package name」)
本地安裝: install.packages(「E:/r/ggplot2_2.1.0.zip」)
四、用R進行基本的統計計算
讓咱們開始熟悉R的編程環境及一些基本的計算,在R編程腳本窗口中輸入程序,以下:
相似地,您也能夠本身嘗試各類組合的計算形式並獲得結果。可是,若是你作了太多的計算,這樣的編程未免過於麻煩,在這種狀況下,建立變量是一個有用的方法。在R中,您能夠建立變量的形式來簡化。建立變量時使用< -或=符號,例如我想建立一個變量x計算7和8的總和,以下:
特別的,一旦咱們建立一個變量,你再也不直接獲得的輸出,此時咱們須要輸入對應的變量而後再運行結果。注意,變量能夠是字母,字母數字而不是數字,數字是不能建立數值變量的、
2、編程基礎慨念及R包
一、R中的數據類型和對象
R中數據類型包括數值型,字符型,邏輯型,日期型及缺省值,這個數據類型咱們在運用數據的過程當中,你們很容易能夠自行了解,在此不作詳細解釋。
R中的數據對象主要包括向量(數字、整數等)、列表、數據框和矩陣。讓具體的進行了解:
1)向量
正如上面提到的,一個向量包含同一個類的對象。可是,你也能夠混合不一樣的類的對象。當對象的不一樣的類混合在一個列表中,這種效應會致使不一樣類型的對象轉換成一個類。例如:
注:一、檢查任何對象的類,使用class()函數的功能。
二、轉換一個數據的類,使用as.()函數
相似地,您能夠本身嘗試改變其餘任何的類向量
2)列表
一個列表是一種包含不一樣的數據類型的元素特殊類型的向量。例如
能夠看出,,列表的輸出不一樣於一個向量。這是由於不一樣類型的全部對象。第一個雙括號[1]顯示了第一個元素包括的索引內容,依次類推。另外的,您本身還能夠嘗試:
3)矩陣
當一個向量與行和列即維度屬性,它變成了一個矩陣。一個矩陣是由行和列組成的,讓咱們試着建立一個3行2列的矩陣:
正如你所看到的,一個矩陣的維度你能夠經過dim()或attributes()命令得到,從一個矩陣中提取一個特定元素,只需使用上面矩陣的形式。例如
一樣的,,您還能夠從個一個向量開始建立所須要的矩陣,咱們,須要作的是利用dim()分配好維度。以下所示:
另外,你也能夠加入兩個向量使用cbind()和rbind()函數。可是,須要確保兩向量相同數量的元素。若是沒有的話,它將返回NA值。
4)數據框
這是最經常使用的一種數據類型,它是用來存儲列表數據的。它不一樣於矩陣,在一個矩陣中,每個元素必須有相同的類。可是,在一個數據框裏你能夠把向量包含不一樣類別的列表。這意味着,每一列的數據就像一個列表,每次你在R中讀取數據將被存儲在一個數據框中。例如:
讓咱們解釋一下上面的代碼。df是數據框的名字。dim()返回數據框的規格是4行2列,str()返回的是一個數據框的結構,nrow()和ncol()返回是數據框的行數和列數。特別的,咱們須要理解一下R中缺失值的概念,NA表明缺失值,這也是預測建模的關鍵部分。如今,咱們示例檢查是否一個數據集有缺失值。
缺失值的存在嚴重阻礙了咱們正常計算數據集。例如,由於有兩個缺失值,它不能直接作均值得分。例如:
na.rm = TRUE告訴R計算時忽略缺失值,只是計算選定的列中剩餘值的均值(得分)。刪除在數據中的行和NA,您可使用na.omit
二、R中的控制語句
正如它的名字同樣,這樣的語句在編碼中起控制函數的做用,寫一個函數也是一組多個命令自動重複編碼的過程。例如:你有10個數據集,你想找到存在於每個數據集中的「年齡」列。這能夠經過兩種方法,一種須要咱們運行一個特定的程序運行10次,另一種就須要經過編寫一個控制語句來完成。咱們先了解下R中的控制結構簡單的例子:
例子:
它首先測試條件,並只有在條件是正確的時才執行,一旦執行循環,條件是再次測試,直到知足指定的條件而後輸出。下面是語法
固然,還有其餘的控制結構,但不太經常使用的比上面的解釋。例如:
Repeat 它執行一個無限循環
break——它打破循環的執行
next——它容許跳過一個迭代循環
return——它幫助退出函數
注意:若是你發現這部分的控制結構難以理解,不用擔憂。R語言中來自於衆多人貢獻的包,會幫助你不少。
三、經常使用的R包
在R的鏡像(CRAN)中,有超過7800個包可供你們調用,其中不少包能夠用來預測建模在本文中,咱們在下面會簡單的介紹其中幾個。以前,咱們已經解釋了安裝包的方法,你們能夠根據本身的須要去下載安裝。
:R爲數據的導入進口提供了普遍的包,而且能夠接入任何格式的數據。如txt,,csv,,sql等都可快速導入大文件的數據,。
R一樣能夠用來構建繪圖命令而且是建立簡單的圖表很是好用。可是,當建立的圖形變得較爲複雜時,你應該安裝ggplot2。
R中有不少關於數據操做集合的包,他們能夠作基本的和先進的快速計算、例如dplyr,plyr ,tidyr,lubricate,stringr等。
對於模型學習,caret包是強大到足以知足大多建立機器學習模型的必要。固然,您也能夠安裝算法包,例如對於隨機森林,決策樹等等。
到這裏爲止,你會以爲對於R的相關組件都相對熟悉啦,從如今開始咱們開始介紹一些關於模型預測的知識。
3、用R進行數據預處理
從這一節開始,咱們將深刻閱讀預測建模的不一樣階段。對於數據的預處理是很是重要的,這一階段學習將強化咱們的對數據操做的應用,讓咱們在接下來的R中去學習和應用一下。在本教程中,咱們以這個大市場銷售預測數據集爲例。首先,咱們先理解一下數據結構,以下圖:
一、數據集中基礎概念
1最後一列ItemOutlet_Sales爲響應變量(因變量y),是咱們須要作出預測的。前面的變量是自變量xi,是用來預測因變量的。
○2數據集
預測模型通常是經過訓練數據集創建,訓練數據老是包括反變量;測試數據:一旦模型構建,它在測試數據集中的測試是較爲準確的,這個數據老是比訓練數據集包含更少數量的觀察值,並且是它不包括反應變量的。
1)在使用R語言時一個重要設置是定義工做目錄,即設置當前運行路徑(這樣你的所有數據和程序都將保存在該目錄下)
一旦設置了目錄,咱們能夠很容易地導入數據,使用下面的命令導入csv文件:
經過R環境檢查數據是否已成功加載,而後讓咱們來探討數據
從結果咱們能夠看到訓練集有8523行12列數據,測試集有5681行和11列訓練數據,而且這也是正確的。測試數據應該老是少一列的。如今讓咱們深刻探索訓練數據集
二、圖形表示
當使用圖表來表示時,我想你們會更好的瞭解這些變量。通常來說,咱們能夠從兩個方面分析數據:單變量分析和雙變量分析。對於單變量分析來說較爲簡單,在此不作解釋。咱們本文以雙變量分析爲例:
(對於可視化,咱們將使用ggplot2包。這些圖能夠幫助咱們更好理解變量的分佈和頻率的數據集)
從圖中,咱們能夠看到大多數銷售已從產品能見度小於0.2。這代表item_visibility < 0.2,則該變量必須是肯定銷售的一個重要因素。
在這裏,咱們推斷多是OUT027的銷量影響啦OUT35的銷量緊隨其後。OUT10和OUT19多是因爲最少的客流量,從而致使最少的出口銷售。
從這個圖表,咱們能夠推斷出水果和蔬菜最有利於銷售零食數量的出口,其次是家用產品。
此次咱們使用箱線圖來表示,箱線圖的好處在於咱們能夠看到相應變量的異常值和平均誤差水平。
在圖中,,黑色的點就是一個異常值,盒子裏黑色的線是每一個項目類型的平均值。
三、缺失值處理
缺失值對於自變量和因變量之間的關係有很大的影響。如今,讓咱們理解一下缺失值的處理的知識。讓咱們來作一些快速的數據探索,首先,咱們將檢查數據是否有缺失值。
咱們能夠看出在訓練數據集中有1463個缺失值。讓咱們檢查這些缺失值的變量在哪裏,其實不少數據科學家一再建議初學者在在數據探索階段應密切關注缺失值。
所以,咱們看到列Item_Weight 有1463個缺失的數據。從這個數據咱們還能夠獲得更多的推論:
從圖中,咱們能夠看到每列的最小值,最大值,中位數,平均值,缺失值的信息等等。咱們看到變量Item_Weight中有缺失值,並且Item_Weight是一個連續變量。所以,在這種狀況下,咱們通常用樣本中變量的均值或中位數賦值給缺失值。計算變量item_weight的均值和中位數,這是最經常使用處理缺失值的的方法,其餘的方法在此不贅述。
咱們能夠先把兩個數據集合並,這樣就不須要編寫獨立編碼訓練和測試數據集,這也會節省咱們的計算時間。可是合併結合兩個數據框,咱們必須確保他們相同的列,以下:
咱們知道,測試數據集有個少一列因變量。首先來添加列,咱們能夠給這個列賦任何值。一個直觀的方法是咱們能夠從訓練數據集中提取銷售的平均值,並使用$Item_Outlet_Sales做爲測試變量的銷售列。不過,在此,咱們讓它簡單化給最後一列賦值爲1。
接下來咱們先來計算中位數,選用中位數是由於它在離散值中頗有表明性。
四、連續變量和分類變量的處理
在數據處理中,對連續數據集和分類變量的分別處理是很是重要的。在這個數據集,咱們只有3個連續變量,其餘的是分類變量。若是你仍然感到困惑,建議你再次使用str()查看數據集。
對於變量Item_Visibility,在上面的圖中能夠看到該項中有的能見度爲零值,這幾乎是不可行的。所以,咱們考慮將它當作缺失值,用中位數來處理。
如今讓咱們繼續處理一下分類變量。在初步的數據探索中,咱們看到有錯誤的水平變量須要糾正。
使用上面的命令,咱們指定的名稱「others」爲其餘未命名的變量,簡要劃分了Item_Fat_Content的等級。
五、特徵值變量計算
如今咱們已經進入了大數據時代,不少時候須要大量的數據算法計算,可是以前所選出的變量不必定會和模型擬合的效果很好。,因此咱們須要提取新的變量,提供儘量多的「新」的信息來幫助模型作出更準確的預測。以合併後的數據集爲例,你以爲哪些因素)可能會影響Item_Outlet_Sales?
在源數據中有10個不一樣的門店,門店的數目越多,說明某種商品更容易在這個商店中售出。
注:管道函數的思路,將左邊的值管道輸出爲右邊調用的函數的第一個參數。
一樣的,咱們也能夠計算商品種類的信息,這樣咱們能夠經過結果看到商品在各家商店出現的頻率。
咱們假設商店的成立時間越久,該商店的客流量和產品銷量越會越多。
以第一個年份爲例,這代表機構成立於1999年,已有14年的歷史(以2013年爲截止年份)。
注:mutate函數,是對已有列進行數據運算並添加爲新列。
經過對商品所屬類型的計算,咱們能夠從其中發現人們的消費趨勢。從數據中們能夠看出仔細看商品標註DR的,大可能是能夠吃的食物。對於FD,大可能是屬於飲品類的。一樣的咱們注意到到NC類,多是生活用品(非消耗品),可是NC類中的所標註較爲複雜。因而,咱們將把這些變量提取出來,並放到一個新變量中。在這裏我將使用substr()和gsub()函數來實現提取和重命名變量。
固然,你也能夠試着去增長一些新變量幫助構建更好的模型,可是,增長新變量時必須使它與其餘的變量之間是不相關的。若是你不肯定與其餘變量之間是否存在相關關係,能夠經過函數cor()來進行判斷。
1)標籤編碼
這一部分的任務是將字符型的標籤進行編碼,例如在在咱們的數據集中,變量Item_Fat_Content有2個級別低脂肪和常規,咱們將低脂編碼爲0和常規型的編碼爲1 。由於這樣可以幫助咱們進行定量的分析。 咱們能夠經過ifelse語句來實現。
2)獨熱編碼
獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每一個狀態都由有獨立的寄存器位,而且在任意時候,其中只有一位有效。例如:變量Outlet_ Location_Type。它有三個層次在獨熱編碼中,,將建立三個不一樣變量1和0組成。1將表明變量存在,,0表明變量不存在。以下::
這是一個獨熱編碼的示範。但願你如今已經理解這個概念。如今這們將這種技術也適用於咱們的數據集分類變量中(不含ID變量)。
以上,咱們介紹了兩種不一樣方法在R中去作獨熱編碼,咱們能夠檢查一下編碼是否已經完成
咱們能夠看出獨熱編碼以後,以前的變量是已經自動被移除了數據集。
4、用機器學習方法進行預測建模
在進行構造數據模型前,咱們將刪除以前已經被轉過的原始變量,能夠經過使用dplyr包中的select()實現,以下:
在本節中,我將介紹迴歸、決策樹和隨機森林等算法。這些算法的詳細解釋已經超出了本文的範圍,若是你想詳細的瞭解,推薦你們看機器學習的相關書籍。如今咱們要將兩個數據集分開,以便咱們來進行預測建模。以下:
一、多元線性迴歸
使用多元迴歸建模時,通常用於響應變量(因變量)是連續型和可供預測變量有不少時。若是它因變量被分類,咱們通常會使用邏輯迴歸。在咱們作迴歸前,咱們先來了解一些迴歸的基本假設:
在R中咱們使用lm()函數來作迴歸,以下:
調整後的R2能夠很好的衡量一個迴歸模型的擬合優度。R2越高說明模型擬合的越好從上圖能夠看出adjusted R2= 0.2084。這意味着咱們擬合的這個模型很不理想。並且能夠p值看出這些新變量例如Item count, Outlet Count 和 Item_Type_New.對於咱們的模型構造而言並無什麼幫助,由於它們的sign.遠小於0.05的顯著性水平。對模型重要的變量是p值小於0.05的變量,也就是上圖中後面帶有*的變量。另外,咱們知道變量之間存在相關性,會影響模型的準確性,咱們能夠利用cor()函數來看一下各變量之間的相關關係。以下:
cor(new_train)
另外,您還可使用corrplot包來作相關係數,以下的程序就幫助咱們找到一個共線性很強的兩個變量
能夠看出變量Outlet_Count與變量Outlet_Type_Grocery Store成高度負相關關係。另外,咱們經過剛纔的分析發現了模型中的一些問題:
接下來,咱們嘗試建立不含編碼和新變量的較大的迴歸模型。以下:
上圖中能夠看到,調整後的R2= 0.5623。這告訴咱們,有時只需你的計算過程簡單一些可能會獲得更精確的結果。讓咱們從一些迴歸圖中去發現一些可以提升模型精度的辦法。
從左上的第一個殘差擬合圖中咱們能夠看出實際值與預測值之間殘差不是恆定的,這說明該模型中存在着異方差。解決異方差性的一個常見的作法就是對響應變量取對數(減小偏差)。
能夠看出調整後的R2= 0.72,說明模型的構建有了顯著的改善,咱們能夠再作一次擬合迴歸圖
上圖中,殘差值與擬合值之間已經沒有了長期趨勢,說明該模型的擬合效果理想。咱們也常常用RMSE來衡量模型的好壞,而且咱們能夠經過這個值與其餘算法相比較。以下所示
接下來讓咱們進行決策樹算法來改善咱們的RMSE得分
二、決策樹
決策樹算法通常優於線性迴歸模型,咱們簡單介紹一下 ,在機器學習中決策樹是一個預測模型。他表明的是對象屬性與對象值之間的一種映射關係。樹中每一個節點表示某個對象,而每一個分叉路徑則表明的某個可能的屬性值,而每一個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。
在R中,決策樹算法的實現可使用rpart包。此外,咱們將使用caret包作交叉驗證。經過交叉驗證技術來構建較複雜的模型時可使模型不容易出現過分擬合的狀況。(關於交叉驗證讀者可自行查閱)另外,,決策樹使用參數CP來衡量訓練集的複雜性和準確性。參數較小的CP值可能將致使更大的決策樹,這也可能會出現過分擬合的模型。相反,參數大的CP值也致使擬合不充分的模型,也就是咱們不能準確的把握所需變量的信息。如下咱們選用五折交叉驗證法來找出具備最優CP的模型。
從上圖能夠看出,參數cp = 0.01所對應的RMSE最小,在此咱們只提供了部分的數據,你能夠在R consle中查詢到更多信息。
main_tree <- rpart(Item_Outlet_Sales ~ ., data = new_train, control = rpart.control(cp=0.01)) #在cp=0.01下構造決策樹 prp(main_tree) #輸出決策樹
以上就是咱們決策樹模型的結構,並且咱們能夠明顯看出變量Item_MRP是最重要的根節點,做爲最重要的變量也就是根節點,來劃分預測將來的銷售量。此外讓咱們檢查一下這個模型的RMSE是否有所改善。
能夠看出,經過決策樹作出的偏差爲1102.774,比線性迴歸得出的偏差小。說明這種方法更優一些。固然你也能夠經過調參數來進一步優化下降這個偏差(如使用十折交叉驗證的方法)
三、隨機森林
隨機森林顧名思義,是用隨機的方式創建一個森林,森林裏面有不少的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在獲得森林以後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類算法),而後看看哪一類被選擇最多,就預測這個樣本爲那一類。隨機森林算法能夠很好的處理缺失值,異常值和其餘非線性的數據,其餘相關知識讀者能夠自行查閱。
在以上的語句中,能夠看到=「parRF」,這是隨機森林的並行實現。這個包讓你在計算隨機森林時花費較短的時間。或者,你也能夠嘗試使用rf方法做爲標準隨機森林的功能。從以上結果中咱們選擇RMSE最小的即選擇mtry = 15,咱們嘗試用1000棵樹作計算,以下:
這個模型中可得出RMSE = 1132.04,並無改進決策樹模型。另外,隨機森林的一個功能是能夠展現重要變量。咱們經過下圖能夠看到最重要的變量是Item_MRP(經過決策樹算法也已經表示出來)。
顯然,這個模型能夠進一步進行嘗試調優參數的。同時,讓咱們用RMSE最好的決策樹來對測試集作擬合。以下所示:
當預測其餘樣本外數據,咱們能夠得出RMSE是1174.33,這個模型是也能夠經過調參數達到更優的,如下列出幾種方法:
你們有什麼新的能使模型預測更優的方法均可以一塊兒來討論,期待與你們的思惟的碰撞。