第1章:數據處理技巧
案例1:
- 數據:6,0000條不明飛行物(UFO)的目睹紀錄和報道。主要目睹紀錄發生在美國。
- 問題:面對這份數據的時空維度,咱們可能會有如下疑問:UFO的出現是否有週期性規律?美國的不一樣州出現的UFO記錄若是有區別,有哪些區別?
#讀入「\t」製表符數據,並設置列名稱
read.delim(" ", sep="\t", stringAsFactors=FALSE, header=FALSE, na.string="")
names()
#處理畸形數據(直接刪除),並轉化日期字符串
nchar()——字符串長度
as.Date(data,format=「%Y%m%d」)
#地點數據(空間維度)
tryCatch()——拋出異常
strsplit()——
gsub()——移除字符串開頭空格?
lapply(<vector>,<func>)——list-apply函數(應用後返回list鏈表),對每一行作操做
do.call(<func=rbind>,<list>)——把列表的一行一行執行rbind,
列表轉換成矩陣,通常和lapply連用
transform()——
tolower()——
match(x,ref)——兩個向量x和ref,x是待匹配的向量,ref是匹配向量,函數返回與x長度相同的向量,若是在ref中未找到匹配項,則默認返回NA
subset()——提取數據
#統計每一個州每一年月的數據來觀察週期性
summary()——
ggplot()——
ggsave(<plot>,<filenmame>)
print()
#數據聚合
seq.date(from,to,by="month")——建立日期時間序列
ddply(data,.(x1,x2)
,nrow)——以行爲單位
strftime(date.range,format="%Y-%m")——把日期對象轉換成一個「YYYY-MM」格式的字符串
merge(data1,data2,by.x,by.y,all=TRUE)
第2章:數據分析
數據處理:數據分析和驗證
一、數據分析
- 方法:用摘要表和基本可視化方法從數據中尋找隱含的模式
- 數值摘要:均值、衆數、百分位數和中位數、標準差和方差
- 可視化方法:直方圖、和密度估計和散點圖
二、數據驗證
- 交叉驗證:用另外一批數據來測試在原數據集上發現的模式
- 假設檢驗:利用機率論來測試原始數據集上發現的模式是不是巧合
一、數據:
知道數據由何而來是區別因果關係和相關關係的惟一方法(從實驗中獲得,仍是因沒有實驗數據而直接觀察記錄而來的)
對象:每列數據
對象:每列數據
對象:兩列數據
對象:多列數據轉換爲少數列
比較:
摘要統計描述的是全部數據在某一列(屬性)上的特色;
降維:把數據集中全部列轉換成少數幾列,獲得的列數據每一行都是惟一的。
二、推斷數據類型
虛擬變量編碼dummy coding:用0和1對一個對象的定性屬性進行描述。
三、數值摘要表
mean——均值
median——中位數
min——最小值
max——最大值
range——取值範圍
quantile(data,prob=seq(0,1,by=0.20))——分位數
var——樣本方差,除數爲n-1,緣由:經驗估算的方差會因爲一些細微緣由比其真值要略小
sd——樣本標準差
注:摘要表中未提到的
衆數可視化方法的
密度曲線圖峯值更易解釋
經過
摘要表瞭解數據的集中程度方法是對比標準差和分位數的範圍
四、可視化分析數據
ggplot()學習!
- 單列可視化:側重數據的形狀(直方圖,密度曲線)
- 雙列可視化:側重兩列之間的關係(散點圖)
- 幾種標準數據形狀(分佈)
4.1直方圖
嘗試不一樣的
區間寬度來檢驗是否存在假象
- 過平滑oversmoothing:區間寬度值大,只能看到個頂峯,對稱性消失
- 欠平滑undersmoothing:區間寬度值小
4.2核密度估計(Kernel Density Estimate,KDE)
密度曲線圖:美觀且在大數據集上更接近理論形狀,有助於發現數據的模式類型。
1)指望的峯值不平坦,數據集在峯值處還隱藏着更多的結構,能夠嘗試
將其中任意一個定性變量將曲線分開
按性別區分,發現有兩個隱藏的鐘形曲線!
這裏每個正態分佈叫一個分片(facet)
2)正態分佈:(高斯分佈或鐘形曲線)
特色:
分佈的均值:
決定鐘形曲線的中心所在
分佈的方差:
決定鐘形曲線的寬度
均值和中位數是相等的,且大部分數據不偏離均值超過3個標準差的數值。
注:不是全部事物都符合正態分佈:好比人們的年收入、股價每日的漲跌
3)衆數:密度曲線的峯值處
4)分佈分類
分類1:
- 單峯unimodal:只有1個衆數的分佈
- 雙峯bimodal:有2個衆數的分佈
- 多峯multimodal:有兩個以上的衆數的分佈
分類2:
- 對稱分佈symmetric:左右兩邊形狀同樣,小於衆數的數據和大於衆數的數據的可能性是同樣的。正態分佈就有這個特色
- 偏態分佈skewed:
伽馬分佈gamma distribution:圖形向右偏斜,衆數右側觀察到極值的可能性要大於其左側
指數分佈exponential distribution
分類3:
- 窄尾分佈thin tailed:數值都在均值附近(99%可能性,3個標準內)正態分佈
- 重尾分佈heavy tailed:
柯西分佈Cauchy distribution(90%在3個標準內,仍有5%可能性在6個標準值外)
比較1:
- 正態分佈:單峯的、對稱的,鐘形的窄尾分佈
- 柯西分佈:單峯的、對稱的,鐘形的重尾分佈
比較2:
- 伽瑪分佈:只有正值(>0)
- 指數分佈:衆數出如今0值處,數據集中頻數最高的是0,而且只有非負值(>=0)
4.3散點圖——列相關的可視化
第3章:分類
分類問題:「決策邊界」
非線性分類:核方法,處理效果不錯,而且幾乎不增長多餘計算成本
案例2:
分類判斷郵件(純文本格式的原始郵件內容)是否爲垃圾郵件
文件標記爲3類:
垃圾郵件spam、易識別的正常郵件easy ham、不易識別的正常郵件hard ham。
一、特徵提取:詞頻word count(「html」和」table「)、僞造的頭部信息、IP地址以及黑名單等
二、文本處理:
如下散點圖會發現,有多處散點重疊的線性
標準的圖形化處理方法:在繪圖以前給這些值
增長隨機噪聲(抖動jittering)
。
file(path,open="rt",encoding="latin1")——open="rt"以文本形式讀取
readLines(<file>)——按行數據讀取
三、建模
訓練集:垃圾郵件取500,易識別郵件500件
特徵:統計詞頻、詞的機率,該詞在文本目錄下全部文件出現的機率
沒在訓練集中出現的詞頻設爲爲較小的機率值0.0001%
總而言之就是機率判斷!寫得真難懂!
第5章 迴歸模型
一、基準模型:最簡單的預測方法就是忽略輸入,而後將過去輸出值的均值做爲預測結果。
二、線性迴歸模型所作的兩個假設:
- 可分性\可加性:變量之間的相互做用
- 單調性\線性:線性比單調性更具約束力
三、
線性迴歸的通常性系統問題:迴歸擅長內推插值(interpolation),卻不擅長外推概括。
當輸入數據偏離既有輸入觀測數據時,預測模型通常不擅長預測其輸出結果。
四、殘差:(預測直線所不能解釋的)偏差。一個模型應該儘量提取較多信號,並把噪聲分開。
儘可能使殘差中不存在結構。
五、衡量預測質量的指標:
- 均方偏差(Mean Squared Errer,MSE):平方偏差的均值
- 均方根偏差(Root Mean Squared Error,RMSE)
在線性迴歸模型中,使用R2,從公式(1-模型.RMSE/均值.RMSE)能夠解釋R2是
比較模型結果與假設只用均值做爲預測結果的好壞。取值範圍爲[0,1],若不如均值好,則爲0;若對每一個數據都作出完美解釋則爲1.
案例3:
預測互聯網上排名前1000的網站在2011年的訪問量。
其中特徵變量中有因子x.f也有連續變量x.c,輸出y是連續變量
先畫散點圖,發現因爲數值跨度的刻度值過大,使得主要數據點趨向於彼此距離很近,沒法將其分開。
再畫密度圖:和散點圖同樣沒法理解。
尺度變換(取log)
:當看到沒有意義的密度圖時,嘗試對分析的數值取log(注:此圖沒必要擔憂對0取log的錯誤!數值不會取0)
對數螺旋曲線P126第4章
建模:lm()
評估:summary():詳細解釋!
Std Error,t-value,p-value等用於評估估計參數結果的不肯定性,即估計參數的置信度。t-value,p-value用於衡量對真實係數不爲0有多大的信心。
一個傳統的肯定輸入、輸出
相關的方法是:爲這個輸入找到一個距離0至少爲2個標準以外的係數!
(估計係數/Std.Error=t-value個標準以外)
三、Residual Standard Error是RMSE值,degree of freedom是自由度=數據點個數-係數個數。當數據較少而是用的係數過多就是一種過擬合
四、R
2指明數據中存在的變化有多少已經被模型所解釋。在Multiple R-squared中,係數越多,就會獲得越大的懲罰。
五、F-statistic解釋它在未知數據上的預測能力,並非模型在用於擬合數據上的效果
若是特徵變量的單獨模型的R
2解釋能力較小,能夠去掉而獲取更具預測能力的輸入模型。
相關性cor():相關並不是因果。
第6章交叉驗證和正則化
Generalized Additive Model(GAM)廣義加性模型
(kernel trick)核方法基本思想是:將非線性問題轉換爲線性問題。
一個好的模型至少能解釋90%的數據,R
2大於90%
多項式迴歸:
- 奇異點問題:過多的增長高次項會致使與低次項之間太相關(多重共線!)以致不正常擬合,會在係數中出現NA值以及沒有*標的問題(奇異點問題)沒法爲每一個特徵找到合適的權重係數。
- 過擬合問題:此時手動添加 (X^2) 不如用poly(x,degree=n)函數。由於它產生的是正交(不相關)多項式,可是高次項過多會致使過擬合問題。
解決方法:交叉驗證和正則化
- 交叉驗證的核心思想:把數據集分爲訓練集和測試集,訓練集(80%)建模,測試集(20%)對模型進行檢驗,用RMSE來度量效果。
- 正則化:「讓模型儘可能擬合訓練數據」與「讓模型儘可能保持簡單「之間作出權衡
一個模型的簡單與複雜能夠經過模型的多項式的次數和
特徵變量的權重大小來衡量,權重越大模型越複雜。
L2
正則化(L2 norm)
:特徵
權重的平方
的累加
L1正則化(L1 norm):特徵
權重的絕對值的累加。(
懲罰較強)
經過交叉驗證來校訂正則化算法。
比較:
- 過擬合:隨着次數不斷增長,訓練偏差和測試偏差變化趨勢開始不一致了,即訓練偏差持續變小,而測試偏差開始變大。
- 欠擬合:模型過於簡單以至訓練集都擬合很差
正則化操做過程:
訓練正則化的線性模型的函數glmnet():執行結果的行數越前正則化越強。其輸出結果的意義是:
1)DF是指明非0權重個數,但不包括截距項。能夠認爲
大部分輸入特徵的權重爲0時,這個模型就是稀疏的(sparse)。
2)%Dev就是模型的R
2
3)超參數(lambda)是正則化參數。lambda越大,說明越在乎模型的複雜度,其懲罰越大,使得模型全部權重趨向於0。
模型最終lambda取值的選擇:能夠
經過交叉驗證,經過輸入glmnet中獲得的不一樣lambda值,
用測試集驗證效果好壞(RMSE評估)
案例4:文本回歸
根據O‘Reilly出版社的銷售前100的暢銷書的逢低描述文原本預測它們的相對流行程度。
特徵變量:某些單詞的詞頻
作迴歸,發現lambda圖效果很差,(隨着lambda變大,模型愈來愈好,可是這種狀況說明模型簡化到了一個常數模型不變了!)
將目標改成:預測它們是否進入排名前50的而分類問題
方法:logstic迴歸
inv.logit()——
預測值y的反logit,boot包的函數
線性迴歸服從高斯分佈,logistic迴歸服從二項分佈
評估:錯誤率
第7章 優化模型
從數據中擬合一個模型可看做是優化問題(optimization)
優化問題(分2步):
step一、爲模型設定一個度量標準(線性迴歸就是RMSE,可是分母不變,可直接計算累加的平方偏差,以節省運算時間)
step二、選擇最優參數a、b取值
- 方法1:網格搜索(gird search):枚舉,可是耗時,而且可能會出現維度災難(特徵變量取值個數的乘積)
- 方法2:優化算法optim函數(主要用於非線性的優化求解,線性迴歸的最小二乘算法與optim計算結果接近)
optim(c(0,0),<func>)——優化問題函數,c(0,0)是優化函數參數的初始值,
返回值par是參數最優勢值,value是參數的最優勢時平方偏差值,counts是返回執行輸入函數func的次數以及梯度gradient的次數,convergence值爲0表示有把握找到最優勢,非0值時對應錯誤,message是一些其它信息。
curve(sapply(x,<func>),<from>,<to>)——畫曲線圖,from和to設置橫座標取值範圍
嶺迴歸
嶺迴歸與普通最小二乘法的惟一區別是:
改變了偏差函數,即嶺迴歸把迴歸係數的自己看成偏差項的一部分,這促使迴歸係數表小。
偏差函數如果改用絕對值,因爲絕對值偏差曲線要比平方偏差或嶺偏差曲線鋒利的多,沒法根據斜率的變化經過optim()找到前進的方向來肯定全局最優勢。以下所示:
案例5:密碼破譯優化問題
僅經過一段密文(
凱撒密碼
),肯定這段密文對應的原文是標準的英語,該如何解碼它
破解替換密碼:
一、爲每一種解密規則定義一個解密效果度量
二、定義一個基於目前已知的解密效果最優的解密規則的算法,對它進行隨機修改來生成一個新的解密規則
三、定義一個算法,能夠遞進地生成破譯效果逐漸變好的解密規則。
利用一個詞典數據庫來計算任何一串字符串是一個真正英文單詞的機率。(由一串高几率單詞組成的文本串更多是真正的英文)
處理不存在的單詞:由於它們的機率是0,去一個接近0的值
打分(1):找到兩個解密串中每一個單詞的機率,再把它們連乘起來獲得整個解密串的機率,根據機率高低來衡量2種解密規則的優劣。
替換密碼(2):有解密規則生成新解密規則的算法最終歸結爲交換兩個字母的現有規則
- 方法1:貪心憂化——只接受使解密串機率變高的新解密規則
- 方法2:
一、解密規則B的解密串機率大於A,則替換A
二、
解密規則B的解密串機率小於A,則以P(B)/P(A)的機率替換A
處理最終
機率
接近0值的方法是去對數在乘積
比較(3):因爲機率高的解密規則問題不具備連續性,不能用optim函數優化來解決,就選用
Metropolis方法
機器學習算法均可以看做是最小化某種預測偏差的優化問題。
可是有些問題沒法經過optim函數的標準優化算法(梯度降低)解決,其它優化算法有:
隨機優化算法,好比:
- 模擬退火(隨着循環次數的增多,愈來愈不能接受沒有變好的規則,即愈來愈貪心。optim函數能夠實現)
- 遺傳算法
- 馬爾可夫鏈蒙特卡洛(MCMC)
- Metropolis方法
第8章主成分分析PCA
比較:
- 有監督:從已知正確答案的訓練集中學習,發現數據中的結構
- 無監督:沒有任何已知答案指導的狀況下,想要發現數據中的結構,好比數據降維
數據降維方法:主成分分析,
- 用一列信息替換多列,監管損失了信息,但在數據的可理解上得到了有價值的回報
- 數據集中每一列都是強相關的時候,PCA特別有效
獨立主成分分析(Independent Component Analysis,ICA)是PCA的變形,某些PCA不能使用的狀況下,能夠發揮很好的做用
方案6:股市數據的降維
2010年1月2日~2011年5月25日期間25只股票的價格
ymd()——lubridate包,將"年-月-日"格式的字符串轉換成日期對象,(能夠比較先後時間)
cast()——reshape包,修改原數據的組織結構,建立一個數據矩陣
cor()——相關性矩陣,結合ggplot能夠觀察相關性的均值和低相關出現的頻率(強相關的時候PCA有效)
princomp() 和 prcomp()——主成分分析,結果的標準差顯示每個主成分的貢獻率(成分方差佔總方差的比例),返回值loadings每一列表明每個成分的載荷因子
predict(<pca>)[,1]——用主成分的第一列做爲原有數據的預測結果
rec()——反轉數據順序
melt(data,id.vars)——reshape包,修改數據組織結構,建立一個數據矩陣,以id.var做爲每行的編號,剩餘列數據取值僅做爲1列數值,並用原列名做爲新數值的分類標記。
第12章模型比較
支持向量機SVM
核方法:用來解決非線性決策邊界。使用一個數學轉換,把原始數據集轉移到一個新的數學空間中,使在
新空間裏的決策邊界是簡單的(線性的)。這個轉換是基於一個核函數的計算。
經常使用的核函數有(4種)
主要超參數
一、線性(linear)
二、多項式(polynomial)
多項式次數:degree=3(默認)先提高,最優,而後降低
(過擬合)
三、徑向(redial)
正則化參數:
cost的增長會
使模型與訓練數據擬合更差一些,cost越大,決策邊界越接近線性(簡化)
四、S型(sigmoid)
gamma越大,模型越好
缺點:大數據集上SVM要花費大量時間,通常就不調參數,指數換換核函數
模型比較:垃圾郵件比較SVM、Logitic迴歸和knn算法
比較結果的經驗總結:
一、
嘗試多種模型算法:
高手是知道某些特定問題不合適某些算法,須要把算法嘗試一遍!
二、根據數據的內在結構
篩選模型:結構在這個問題中logistic迴歸效果最好,其它非線性模型並很差,說明該問題的決策邊界多是線性的,
最優
模型必定知足數據的內在結構特徵的(在商業中也是用Logistic迴歸來淘汰樸素貝葉斯分類器)
三、根據度量標準
篩選模型參數:模型效果
取決於具體的問題、數據結構特徵,同時也取決於你爲模型參數調優付出的努力