此書網上有英文電子版:Machine Learning with R - Second Edition [eBook].pdf(附帶源碼)
評價本書:入門級的好書,介紹了多種機器學習方法,全部用R相關的包實現,案例十分詳實,理論與實例結合。
目錄
第一章 機器學習簡介
第二章 數據的管理和理解
第三章 懶惰學習--使用近鄰分類
第四章 概率學習--朴素貝葉斯分類
第五章 分而治之--應用決策樹和規則進行分類
第六章 預測數值型數據--回歸方法
第七章 黑箱方法--神經網絡和支持向量機
第八章 探尋模式--基於關聯規則的購物籃分析
第九章 尋找數據的分組--k均值聚類
第十章 模型性能的評價
第十一章 提高模型的性能
第十二章 其他機器學習主題
第一章 機器學習簡介
機器學習注重於現實的應用,通常是與特定問題聯系在一起,機器學習更像是培訓員工,而不是養育孩子。
- 機器學習的起源及其實際應用
- 知識是如何在計算機中定義和表達的
- 用來區分機器學習方法的基本概念
機器學習提供了應用計算機並把數據轉換成可行動的知識的工具集合。
1.1 起源
我們的存在離不開信息,我們依賴數據而存在,大腦就是一個黑箱,連接黑箱和外界的就是你的感官,在時間流里,各種數據被我們的感官提取,傳入大腦。大腦可以對信息進行建模,理解信息,預測未來,通過肌肉控制器對外發出指令,改變外在的世界。
語言是這整個環節當中一個非常重要的因素,語言可以將數據在不同的大腦模型間傳遞,這些模型就組成了更為強大的網絡,創造了高等文明。語言也是一種客觀的記錄工具。
我們人類的語言是對我們存在世界的一種映射,而計算機語言則很局限,僅為執行任務而生;我們的大腦能夠對整個世界建模,能對將這世界的每一個物體抽象建模。
人類之所以強大,是因為它是作為一個整體存在的,任何個體都只會是這個網絡中的一個節點。
我們一直存在於大數據之中,只是現在我們更容易的獲取數據了。
如果我們理解了數據中存在的有規律的模式,我們就能做出有潛力的預測。
機器學習,發明計算機算法,把數據轉化為智能行為。(核心循環的三者:現有數據;統計方法;計算能力)
數據挖掘,從大型數據庫中產生新的洞察,側重尋找有價值的信息;機器學習側重於執行一個已知的任務。
(在商業上一個重要的應用就是根據客戶的購買行為,預測其需求,從而為其提供個性化的服務和推銷。)
1.2 學習理論
定義:如果機器能夠獲取經驗並且能利用它們,在以后的類似經驗中能夠提高它的表現,這種行為就是機器的學習。
學習過程:
- 數據輸入,觀察(抽象並提取信息),記憶(將信息存儲在大腦的某個文件里),回憶(打開大腦里的文件)
- 抽象化,將數據轉換成更寬泛的表現形式
- 一般化,應用抽象數據來形成行動的基礎
舉例:學習&考試
過目不忘並不是一種本領,而是一種低級的作弊方式,你沒有深刻理解知識,數據本身並不能為你做出決策;必須理解核心概念(建立大綱、概念圖),明確信息之間的關系,以主題為中心(這就是知識抽象化)。 一般化,需要大量抽象數據,理解如何將已有知識應用到未知場景中(好的老師能做到這兩點)。
1.2.1 抽象化和知識表達
原始數據是沒有意義的,僅僅是一些01或符號而已,抽象化賦予數據以具體含義。
idea 和 reality,只是語言的抽象連接。
知識表達中,將原始數據概括在一個模型里,該模型就是數據間結構化的顯式描述。(方程,圖表,分類都是模型)
學習的任務和所分析數據的類型決定選擇使用什么模型。
用一個特定的模型來擬合數據集的過程稱為訓練(還沒達到學習,這還只是抽象化,學習還包括一般化)。
當模型被訓練后,數據轉換為一個匯總了原始信息的抽象形式。模型提供了數據之間的關系或聯系。
1.2.2 一般化
抽象化過程中可能發現無數的內在關系,有多種方法可以對內在關系建模(集合),為了預測,必須選定模型。
定義:一般化描述了把抽象化的知識轉換成可以用於行動的形式。是訓練過程中對所有可用於數據抽象化的模型的搜索過程。
一般不會遍歷每一種可能來確定模型,而是用啟發式方法。
偏差,就是系統誤差,是模型與真實值之間的差距。偏差是普遍存在的。
一般化的最后一步就是在存在偏差的情況下判斷模型的成功性。
數據中必然存在噪音,模型不能擬合噪音而造成過度擬合,模型處理噪音數據的好壞是判斷模型成功與否的重要方面。
1.3 應用機器學習的步驟
- 收集數據,數據的多種來源
- 探索數據和准備數據,這一步需要大量人工干預,80%精力花費在此。
- 基於數據訓練模型,模型,算法,表示數據
- 評價模型性能,每個模型會產生一個學習問題的有偏差的解決方法。能用一個測試集來評價模型的精確度。
- 改進模型性能
1.4 選擇機器學習算法
要權衡學習數據的特征和可以使用方法的偏差。理解所分析數據的類型和任務。
1.4.1 輸入的數據
幾乎所有的輸入數據都是以樣本(example)和特征值(feature)組成的表格。
特征有多種形式:數值型特征,分類變量,有序變量(有序的,如大中小)是一種特殊的分類變量。
1.4.2 機器學習算法的類型
- 監督學習,建立預測模型,利用數據集中的其他數值來預測另一個值。發現並且建模目標特征和其他特征之間的關系。目標值擔任監督的角色,告訴機器學習的任務是什么。 給定訓練集,學習算法會最優化一個模型(函數)來找出屬性值之間的組合方式,最終給出目標值。 常見的有分類,回歸分析。
- 無監督學習,建立描述模型,沒有學習目標。模式發現,購物籃分析,聚類,
1.4.3 為數據匹配合適的算法
模型 | 任務 | 章節 |
有監督學習算法 | ||
近鄰法 | 分類 | 3 |
朴素貝葉斯 | 分類 | 4 |
決策樹 | 分類 | 5 |
分類器 | 分類 | 5 |
線性回歸 | 數值預測 | 6 |
回歸樹 | 數值預測 | 6 |
模型樹 | 數值預測 | 6 |
神經網絡 | 雙重 | 7 |
支持向量機 | 雙重 | 7 |
無監督學習 | ||
關聯規則 | 模式識別 | 8 |
k均值聚類 | 聚類 | 9 |
1.5 使用R進行機器學習
第一次安裝R包就折騰了好久,可以下載,但是不能載入包,顯示 rJava 不正常。
重新配置了好久的Java環境變量,還是不行,於是下載了32位的Java,把R也調成32位的,稍微正常了,但是顯示R版本過低。
更新了R后,Rstudio又報錯,顯示Rstudio版本過低,於是重新安裝了最新版本的RStudio,一切正常。
總結:軟件最好都用最新版的。
install.packages("RWeka") install.packages("RWeka", lib="/path/to/library") ?install.packages
library(RWeka)
1.6 總結
機器學習起源於統計學、數據庫科學和計算機科學的交互。
機器學習涉及把數據抽象為結構化表示,並把這個結構化表示進行一般化,然后推廣到行動中。
具體而言,數據(樣品,特征),概括為模型,用於預測或描述。
用R包進行機器學習。
第二章 數據的管理和理解
初期的核心就是管理和理解所收集的數據。然后才能建立和部署模型。
- 基本的R數據結構以及如何使用它們來存儲和提取數據
- 如何把不同來源格式的數據導入R
- 理解並可視化復雜數據的常用方法
2.1 R的數據結構
常用的R數據結構有:向量,因子,列表,數組,數據框。
2.1.1 向量
c()
向量存儲一組有序的值,向量可以包含任意數量的元素,但所有的元素必須是同一類型。
常見的類型有:integer(整型,沒有小數點);numeric(數值型,包含小數點);character(字符型,文本數據);logical(邏輯型,取值為TRUE或FALSE);NULL(沒有任何值);NA(缺失值)。
用組合函數(combine function)c()來創建簡單的向量:
向量有固有的順序,能通過序號來訪問;不同於其他編程語言,R語言中序號是從1開始的。
## Vectors ----- # create vectors of data for three medical patients subject_name <- c("John Doe", "Jane Doe", "Steve Graves") temperature <- c(98.1, 98.6, 101.4) flu_status <- c(FALSE, FALSE, TRUE) # access the second element in body temperature vector temperature[2] ## examples of accessing items in vector # include items in the range 2 to 3 temperature[2:3] # exclude item 2 using the minus sign temperature[-2] # use a vector to indicate whether to include item temperature[c(TRUE, TRUE, FALSE)]
2.1.2 因子
factor()
用類別值來代表特征的屬性稱為名義屬性,理論上可以用字符型向量來代替,但R有專用的因子(factor)數據結構來表示這種屬性。
因子就是向量的特列,因子在實際存儲時,只存儲數字1,2,3等數字,以此來節約內存。
可以將向量轉換為因子,使用factor()函數;
水平(level),是數據可能取到的所有類別組成。在定義因子時,可以顯示的定義水平值。
還可以創建有序因子
## Factors ----- # add gender factor gender <- factor(c("MALE", "FEMALE", "MALE")) gender # add blood type factor blood <- factor(c("O", "AB", "A"), levels = c("A", "B", "AB", "O")) blood # add ordered factor symptoms <- factor(c("SEVERE", "MILD", "MODERATE"), levels = c("MILD", "MODERATE", "SEVERE"), ordered = TRUE) symptoms # check for symptoms greater than moderate symptoms > "MODERATE"
2.1.3 列表
list()
列表也是一種特殊類型的向量,但列表的元素可以是任意不同的類型。
我們用c()創建向量,用list()創建列表;列表可以指定每一項名字,可以通過名字來訪問列表的值,而不是像向量那樣使用序號。
創建列表,傳入一組值(逗號分開),並為每個值命名。
如何訪問列表元素?類似哈希結構,通過名字訪問;也可以通過序號訪問;可以同時獲取多個列表項;
單純的列表似乎沒有什么意義。
## Lists ----- # display information for a patient subject_name[1] temperature[1] flu_status[1] gender[1] blood[1] symptoms[1] # create list for a patient subject1 <- list(fullname = subject_name[1], temperature = temperature[1], flu_status = flu_status[1], gender = gender[1], blood = blood[1], symptoms = symptoms[1]) # display the patient subject1 ## methods for accessing a list # get a single list value by position (returns a sub-list) subject1[2] # get a single list value by position (returns a numeric vector) subject1[[2]] # get a single list value by name subject1$temperature # get several list items by specifying a vector of names subject1[c("temperature", "flu_status")] ## access a list like a vector # get values 2 and 3 subject1[2:3]
2.1.4 數據框(最重要)
data.frame()
數據框既有行數據,又有列數據,類似於電子表格。
數據框是一個向量列表或者因子列表,每一列都有相同數量的值,結合了向量和列表的特點。
如何創建數據框?data.frame()函數可以將向量組合為數據框;向量名將會成為數據框的標題行;
如何提取數據框中的某一行或某一列?可以通過向量名提取(可以多行提取),可以按行號和列號提取【rows, colums】;
## Data frames ----- # create a data frame from medical patient data pt_data <- data.frame(subject_name, temperature, flu_status, gender, blood, symptoms, stringsAsFactors = FALSE) # display the data frame pt_data ## accessing a data frame # get a single column pt_data$subject_name # get several columns by specifying a vector of names pt_data[c("temperature", "flu_status")] # this is the same as above, extracting temperature and flu_status pt_data[2:3] # accessing by row and column pt_data[1, 2] # accessing several rows and several columns using vectors pt_data[c(1, 3), c(2, 4)] ## Leave a row or column blank to extract all rows or columns # column 1, all rows pt_data[, 1] # row 1, all columns pt_data[1, ] # all rows and all columns pt_data[ , ] # the following are equivalent pt_data[c(1, 3), c("temperature", "gender")] pt_data[-2, c(-1, -3, -5, -6)]
2.1.5 矩陣和數組
matrix()
矩陣也是用來存儲表格的,不過只能存儲單一類型的數據,矩陣一般是用來做數學運算的,通常存儲數值型數據。
數組是多維(多層)矩陣
## Matrixes ----- # create a 2x2 matrix m <- matrix(c(1, 2, 3, 4), nrow = 2) m # equivalent to the above m <- matrix(c(1, 2, 3, 4), ncol = 2) m # create a 2x3 matrix m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2) m # create a 3x2 matrix m <- matrix(c(1, 2, 3, 4, 5, 6), ncol = 2) m # extract values from matrixes m[1, 1] m[3, 2] # extract rows m[1, ] # extract columns m[, 1]
2.2 用R管理數據
2.2.1 保存和加載R數據結構
save()函數把R數據結構寫到由file參數設定的位置
load()函數將會加載任何一種保存在以“.RData”的數據結構,注意:加載后會覆蓋工作區中已存在的相同的變量。
save.image()會把所有的會話寫入文件,下次啟動時自動尋找此文件,恢復上次會話。
## saving, loading, and removing R data structures save(x, y, z, file = "mydata.RData") load("mydata.RData") save.image() # show all data structures in memory ls() # remove the m and subject1 objects rm(m, subject1) ls() rm(list=ls())
2.2.2 用CSV文件導入和保存數據
read.csv()
read.table()
write.csv()
## data exploration example using used car data usedcars <- read.csv("usedcars.csv", stringsAsFactors = FALSE) mydata <- read.csv("mydata.csv", stringsAsFactors = FALSE, header = FALSE) write.csv(pt_data, file = "pt_data.csv")
2.2.3 從SQL數據庫導入數據
odbcConnect()
sqlQuery()
odbcClose()
ODBC SQL(開放數據庫);數據庫管理系統(DBMS);ODBC是一個連接到數據庫的標准規范;需要通過數據源名稱(DSN)連接;
首先需要安裝RODBC包;然后連接到DSN數據庫(可能需要用戶名和密碼);使用sqlQuery()函數執行SQL查詢得到數據庫的行數據;建立數據框;
## SQL install.packages("RODBC") library(RODBC) mydb <- odbcConnect("my_dsn") mydb <- odbcConnect("my_dsn", uid = "my_username", pwd = "my_password") patient_query <- "select * from patient_data where alive = 1" patient_data <- sqlQuery(channel = mydb, query = patient_query, stringsAsFactors = FALSE) odbcClose(mydb)
2.3 探索和理解數據
2.3.1 數據的結構
read.scv()
str()
數據導入到R后,就要開始對數據做一個基本的檢查;數據的特征和案例;理解數據的獨特,以便后面讓模型匹配具體的學習問題;
## data exploration example using used car data usedcars <- read.csv("usedcars.csv", stringsAsFactors = FALSE) # get structure of used car data str(usedcars)
2.3.2 數值型變量
summary()
匯總統計量分兩類:數據的中心測度 和 分散程度測度
# summarize numeric variables summary(usedcars$year) summary(usedcars[c("price", "mileage")])
2.3.2.1 測量中心趨勢--平均數和中位數
mean()
median()
一類統計量:標識一組數據的中間值;
平均數:按照值的加和,得出平均數;如果平均值偏低,表名數據中小的數偏多;均值不一定最合適;
中位數:按照次序,位於中間的那個數;中位數反映中等水平,不能全面反映數據。
均值對異常值非常敏感,容易受到少數幾個極端值的影響;
(實例:均值比中位數大很多,暗示着存在幾個極大值)
# calculate the mean income (36000 + 44000 + 56000) / 3 mean(c(36000, 44000, 56000)) # the median income median(c(36000, 44000, 56000))
2.3.2.2 測量數據分散程度--四分位數和五分位數
min()
max()
range()
diff()
IQR()
quantile()
seq()
測量數值的大小是否具有多樣性;與數據的分散程序有關;
五數匯總:最小值、第一四分位數、中位數、第三四分位數、最大值;
第一四分位數(Q1)、第三四分位數(Q3)和中位數(Q2)一起講數據集分為了4個元素數量均等的部分。
Q1和Q3之間的50%意義重大,為四分位距(IQR),它就是數據分散程度的一個測度。
通過比較差值大小,可以判斷哪個區域之間聚集的更加緊密。
# the min/max of used car prices range(usedcars$price) # the difference of the range diff(range(usedcars$price)) # IQR for used car prices IQR(usedcars$price) # use quantile to calculate five-number summary quantile(usedcars$price) # the 99th percentile quantile(usedcars$price, probs = c(0.01, 0.99)) # quintiles quantile(usedcars$price, seq(from = 0, to = 1, by = 0.20))
2.3.2.3 箱圖
boxplot()
箱圖是對五數匯總的常用的可視化方式;可以顯示數值型變量的中心和分散程度;可以很快了解變量的值域和偏度;
用水平線來表示五數匯總的值;盒子上的三條線分別是Q1、Q2、Q3;
最大值和最小值用細線表示;細線通常會有所保留;向內聚合;Q1-1.5*IQR 和 Q3+1.5*IQR;代替了min 和 max;
任何坐落在min到Q1-1.5*IQR 和 Q3+1.5*IQR到max之間的值都是異常值,用圓圈或者點來表示。
# boxplot of used car prices and mileage boxplot(usedcars$price, main="Boxplot of Used Car Prices", ylab="Price ($)") boxplot(usedcars$mileage, main="Boxplot of Used Car Mileage", ylab="Odometer (mi.)")
2.3.2.4 直方圖
hist()
直方圖是形象化描述數值型變量間差異的方式。高度代表頻率,橫坐標為分段內的起點和終點。
# histograms of used car prices and mileage hist(usedcars$price, main = "Histogram of Used Car Prices", xlab = "Price ($)") hist(usedcars$mileage, main = "Histogram of Used Car Mileage", xlab = "Odometer (mi.)")
2.3.2.5 均勻分布和正態分布
2.3.2.6 方差和標准差
var()
sd()
正態分布可以用兩個參數來定義:中心 和 分散程度。
中心用均值來定義;分散程度用標准差來測量;
# variance and standard deviation of the used car data var(usedcars$price) sd(usedcars$price) var(usedcars$mileage) sd(usedcars$mileage)
2.3.3 分類變量
table()
prop.table()
round()
不能用summary()函數,而是用table()函數;
# one-way tables for the used car data table(usedcars$year) table(usedcars$model) table(usedcars$color) # compute table proportions model_table <- table(usedcars$model) prop.table(model_table) # round the data color_table <- table(usedcars$color) color_pct <- prop.table(color_table) * 100 round(color_pct, digits = 1)
2.3.4 變量之間關系
之前都是考察單變量統計量,現在我們開始考慮多變量之間的關系;
2.3.4.1 散點圖
plot()
兩個變量之間線性關系的強弱是通過統計量相關系數來測量的。
# scatterplot of price vs. mileage plot(x = usedcars$mileage, y = usedcars$price, main = "Scatterplot of Price vs. Mileage", xlab = "Used Car Odometer (mi.)", ylab = "Used Car Price ($)")
2.3.4.2 雙向交叉表
%in%
CrossTable()
用於檢查兩個名義變量(分類變量)之間的關系;
# new variable indicating conservative colors usedcars$conservative <- usedcars$color %in% c("Black", "Gray", "Silver", "White") # checking our variable table(usedcars$conservative) # Crosstab of conservative by model library(gmodels) CrossTable(x = usedcars$model, y = usedcars$conservative)
2.4 總結
第三章 懶惰學習--使用近鄰分類
第四章 概率學習--朴素貝葉斯分類
第五章 分而治之--應用決策樹和規則進行分類
第六章 預測數值型數據--回歸方法
第七章 黑箱方法--神經網絡和支持向量機
第八章 探尋模式--基於關聯規則的購物籃分析
第九章 尋找數據的分組--k均值聚類
第十章 模型性能的評價
第十一章 提高模型的性能