此書網上有英文電子版: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,一切正常。
總結:軟體最好都用最新版的。
- 'JAVAC' 不是内部或外部指令解決方法
- 配置JAVA的環境變量
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)