fir.md

想寫這個(gè)系列很久了汗捡,最近剛好項(xiàng)目結(jié)束了閑下來(lái)有點(diǎn)時(shí)間,于是決定把之前學(xué)過的東西做個(gè)總結(jié)汇鞭。之前看過一些機(jī)器學(xué)習(xí)方面的書凉唐,每本書都各有側(cè)重點(diǎn),機(jī)器學(xué)習(xí)實(shí)戰(zhàn)和集體智慧編程更偏向與實(shí)戰(zhàn)霍骄,側(cè)重于對(duì)每個(gè)算法的實(shí)際操作過程台囱,但是沒有對(duì)整個(gè)數(shù)據(jù)挖掘項(xiàng)目做介紹,李航老師的統(tǒng)計(jì)學(xué)習(xí)方法和周志華老師的機(jī)器學(xué)習(xí)這兩本書側(cè)重對(duì)原理的講解和公式的推導(dǎo)读整,但是實(shí)戰(zhàn)方面可能會(huì)少一點(diǎn)簿训。我結(jié)合之前看過的書,以及自己的一些項(xiàng)目經(jīng)驗(yàn)做了一些總結(jié)米间,一是回顧自己還有哪些遺漏强品,二是希望給新入門的同學(xué)一個(gè)參考。至于編程語(yǔ)言屈糊,主要用python的榛,也會(huì)有少部分R,java和scala之類逻锐,畢竟實(shí)際項(xiàng)目中也不可能使用一種語(yǔ)言夫晌。此外,本系列所用到的所有數(shù)據(jù)我會(huì)傳到Github上昧诱,需要的同學(xué)可以自行下載晓淀。為保證文章質(zhì)量,每周二周四更新盏档,下面是主要的目錄(可能會(huì)根據(jù)實(shí)際情況調(diào)整):
第一部分 模型的評(píng)估與數(shù)據(jù)處理
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(一)----數(shù)據(jù)清洗
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二)----數(shù)據(jù)轉(zhuǎn)換
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三)----數(shù)據(jù)降維

第二部分 特征工程
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(四)----特征選擇
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(五)----特征提取
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(六)----模型選擇與評(píng)估

第三部分 算法基礎(chǔ)之有監(jiān)督算法
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(七)----廣義線性模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(八)----最小二乘法
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(九)----LDA
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十)----SGD
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十一)----K近鄰
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十二)----高斯過程
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十三)----決策樹(ID3凶掰,C4.5,C5.0,CART)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十四)----樸素貝葉斯
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十五)----支持向量機(jī)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十六)----集成學(xué)習(xí)(Bagging懦窘,RF前翎,AdaBoost,Gradient Tree Boosting畅涂,Voting Classifier)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十七)----感知機(jī)模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十八)----多分類算法

第四部分 算法基礎(chǔ)之無(wú)監(jiān)督算法
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(十九)----K-means
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十)----Affinity propagation
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十一)----Mean-shift
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十二)----Spectral clustering
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十三)----Ward hierachical
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十四)----Agglomerative clustering
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十五)----DBSCAN
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十六)----Gaussian mixtures
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十七)----Birch

第五部分 算法基礎(chǔ)之推薦算法
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十八)----相似度計(jì)算
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二十九)----Arules關(guān)聯(lián)規(guī)則
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十)----Fp-Growth
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十一)----User-based or Item-based

第六部分 算法基礎(chǔ)之半監(jiān)督模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十二)----Label Propagation

第七部分 算法基礎(chǔ)之其他模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十三)----概率圖模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十四)----最大熵模型
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十五)----規(guī)則學(xué)習(xí)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十六)----強(qiáng)化學(xué)習(xí)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十七)----條件隨機(jī)場(chǎng)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十八)----保序回歸(Isotonic regression)
機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(三十九)----Probability calibration

正文:
  按照我做項(xiàng)目的經(jīng)驗(yàn)鱼填,來(lái)了項(xiàng)目,首先是分析項(xiàng)目的目的和需求苹丸,了解這個(gè)項(xiàng)目屬于什么問題,要達(dá)到什么效果扇单。然后提取數(shù)據(jù)施流,做基本的數(shù)據(jù)清洗装诡。第三步是特征工程,這個(gè)屬于臟活累活,需要耗費(fèi)很大的精力,如果特征工程做的好鲜侥,那么舀寓,后面選擇什么算法其實(shí)差異不大,反之,不管選擇什么算法,效果都不會(huì)有突破性的提高膛檀。第四步嚎杨,是跑算法容贝,通常情況下,我會(huì)把所有能跑的算法先跑一遍,看看效果,分析一下precesion/recall和f1-score,看看有沒有什么異常(譬如有好幾個(gè)算法precision特別好顷歌,但是recall特別低赦抖,這就要從數(shù)據(jù)中找原因浮禾,或者從算法中看是不是因?yàn)樗惴ú贿m合這個(gè)數(shù)據(jù))盈电,如果沒有異常,那么就進(jìn)行下一步杯活,選擇一兩個(gè)跑的結(jié)果最好的算法進(jìn)行調(diào)優(yōu)旁钧。調(diào)優(yōu)的方法很多寄猩,調(diào)整參數(shù)的話可以用網(wǎng)格搜索、隨機(jī)搜索等冷守,調(diào)整性能的話,可以根據(jù)具體的數(shù)據(jù)和場(chǎng)景進(jìn)行具體分析。調(diào)優(yōu)后再跑一邊算法,看結(jié)果有沒有提高或悲,如果沒有孙咪,找原因麻掸,數(shù)據(jù) or 算法茅信?是數(shù)據(jù)質(zhì)量不好,還是特征問題還是算法問題遍愿。一個(gè)一個(gè)排查男公,找解決方法荤堪。特征問題就回到第三步再進(jìn)行特征工程,數(shù)據(jù)質(zhì)量問題就回到第一步看數(shù)據(jù)清洗有沒有遺漏枢赔,異常值是否影響了算法的結(jié)果澄阳,算法問題就回到第四步,看算法流程中哪一步出了問題踏拜。如果實(shí)在不行碎赢,可以搜一下相關(guān)的論文,看看論文中有沒有解決方法速梗。這樣反復(fù)來(lái)幾遍肮塞,就可以出結(jié)果了,寫技術(shù)文檔和分析報(bào)告姻锁,再向業(yè)務(wù)人員或產(chǎn)品講解我們做的東西枕赵,然后他們?cè)偬峤ㄗh/該需求,不斷循環(huán)位隶,最后代碼上線烁设,改bug,直到結(jié)項(xiàng)钓试。
  直觀來(lái)看装黑,可以用一個(gè)流程圖來(lái)表示:


今天講數(shù)據(jù)清洗,為什么要進(jìn)行數(shù)據(jù)清洗呢弓熏?我們?cè)跁峡吹降臄?shù)據(jù)恋谭,譬如常見的iris數(shù)據(jù)集,房?jī)r(jià)數(shù)據(jù)挽鞠,電影評(píng)分?jǐn)?shù)據(jù)集等等疚颊,數(shù)據(jù)質(zhì)量都很高狈孔,沒有缺失值,沒有異常點(diǎn)材义,也沒有噪音均抽,而在真實(shí)數(shù)據(jù)中,我們拿到的數(shù)據(jù)可能包含了大量的缺失值其掂,可能包含大量的噪音油挥,也可能因?yàn)槿斯や浫脲e(cuò)誤導(dǎo)致有異常點(diǎn)存在,對(duì)我們挖據(jù)出有效信息造成了一定的困擾款熬,所以我們需要通過一些方法深寥,盡量提高數(shù)據(jù)的質(zhì)量。數(shù)據(jù)清洗一般包括以下幾個(gè)步驟:
一.分析數(shù)據(jù)
二.缺失值處理
三.異常值處理
四.去重處理
五.噪音數(shù)據(jù)處理
六.一些實(shí)用的數(shù)據(jù)處理小工具

一.分析數(shù)據(jù)
  在實(shí)際項(xiàng)目中贤牛,當(dāng)我們確定需求后就會(huì)去找相應(yīng)的數(shù)據(jù)惋鹅,拿到數(shù)據(jù)后,首先要對(duì)數(shù)據(jù)進(jìn)行描述性統(tǒng)計(jì)分析殉簸,查看哪些數(shù)據(jù)是不合理的闰集,也可以知道數(shù)據(jù)的基本情況。如果是銷售額數(shù)據(jù)可以通過分析不同商品的銷售總額般卑、人均消費(fèi)額返十、人均消費(fèi)次數(shù)等,同一商品的不同時(shí)間的消費(fèi)額椭微、消費(fèi)頻次等等洞坑,了解數(shù)據(jù)的基本情況。此外可以通過作圖的方式了解數(shù)據(jù)的質(zhì)量蝇率,有無(wú)異常點(diǎn)迟杂,有無(wú)噪音等。舉個(gè)例子(這里數(shù)據(jù)較少本慕,就直接用R作圖了):

1 #一組年薪超過10萬(wàn)元的經(jīng)理收入
2 pay=c(11,19,14,22,14,28,13,81,12,43,11,16,31,16,23.42,22,26,17,22,13,27,180,16,43,82,14,11,51,76,28,66,29,14,14,65,37,16,37,35,39,27,14,17,13,38,28,40,85,32,25,26,16,12,54,40,18,27,16,14,33,29,77,50,19,34)
3 par(mfrow=c(2,2))#將繪圖窗口改成2*2排拷,可同時(shí)顯示四幅圖
4 hist(pay)#繪制直方圖
5 dotchart(pay)#繪制點(diǎn)圖
6 barplot(pay,horizontal=T)#繪制箱型圖7 qqnorm(pay);qqline(pay)#繪制Q-Q圖

從上面四幅圖可以很清楚的看出,180是異常值锅尘,即第23個(gè)數(shù)據(jù)需要清理监氢。

python中也包含了大量的統(tǒng)計(jì)命令,其中主要的統(tǒng)計(jì)特征函數(shù)如下圖所示:


二.缺失值處理
  缺失值在實(shí)際數(shù)據(jù)中是不可避免的問題藤违,有的人看到有缺失的數(shù)據(jù)就直接刪除了浪腐,有的人直接賦予0值或者某一個(gè)特殊的值,那么到底該怎么處理呢顿乒?對(duì)于不同的數(shù)據(jù)場(chǎng)景應(yīng)該采取不同的策略议街,首先應(yīng)該判斷缺失值的分布情況:

1 import scipy as sp2 data = sp.genfromtxt("web_traffic.tsv",delimiter = "\t")

數(shù)據(jù)情況如下:

1 >>>data 
2 array([[ 1.00000000e+00, 2.27200000e+03], 
3 [ 2.00000000e+00, nan], 
4 [ 3.00000000e+00, 1.38600000e+03], 
5  ..., 
6 [ 7.41000000e+02, 5.39200000e+03], 
7 [ 7.42000000e+02, 5.90600000e+03], 
8 [ 7.43000000e+02, 4.88100000e+03]]) 
9 
10 >>> print data[:10]
11 [[ 1.00000000e+00 2.27200000e+03]
12 [ 2.00000000e+00 nan]
13 [ 3.00000000e+00 1.38600000e+03]
14 [ 4.00000000e+00 1.36500000e+03]
15 [ 5.00000000e+00 1.48800000e+03]
16 [ 6.00000000e+00 1.33700000e+03]
17 [ 7.00000000e+00 1.88300000e+03]
18 [ 8.00000000e+00 2.28300000e+03]
19 [ 9.00000000e+00 1.33500000e+03]
20 [ 1.00000000e+01 1.02500000e+03]]
21
 22 >>> data.shape23 (743, 2)

可以看到,第2列已經(jīng)出現(xiàn)了缺失值璧榄,現(xiàn)在我們來(lái)看一下缺失值的數(shù)量:

1 >>> x = data[:,0]
2 >>> y = data[:,1]
3 >>> sp.sum(sp.isnan(y))
4 8

在743個(gè)數(shù)據(jù)里只有8個(gè)數(shù)據(jù)缺失特漩,所以刪除它們對(duì)于整體數(shù)據(jù)情況影響不大吧雹。當(dāng)然,這是缺失值少的情況下涂身,在缺失值值比較多雄卷,而這個(gè)維度的信息還很重要的時(shí)候(因?yàn)槿笔е等绻剂?5%以上,可以直接去掉這個(gè)維度的數(shù)據(jù)了)蛤售,直接刪除會(huì)對(duì)后面的算法跑的結(jié)果造成不好的影響丁鹉。我們常用的方法有以下幾種:
1.直接刪除----適合缺失值數(shù)量較小,并且是隨機(jī)出現(xiàn)的悍抑,刪除它們對(duì)整體數(shù)據(jù)影響不大的情況
2.使用一個(gè)全局常量填充---譬如將缺失值用“Unknown”等填充鳄炉,但是效果不一定好杜耙,因?yàn)樗惴赡軙?huì)把它識(shí)別為一個(gè)新的類別搜骡,一般很少用
3.使用均值或中位數(shù)代替----優(yōu)點(diǎn):不會(huì)減少樣本信息,處理簡(jiǎn)單佑女。缺點(diǎn):當(dāng)缺失數(shù)據(jù)不是隨機(jī)數(shù)據(jù)時(shí)會(huì)產(chǎn)生偏差.對(duì)于正常分布的數(shù)據(jù)可以使用均值代替记靡,如果數(shù)據(jù)是傾斜的,使用中位數(shù)可能更好团驱。
4.插補(bǔ)法
  1)隨機(jī)插補(bǔ)法----從總體中隨機(jī)抽取某個(gè)樣本代替缺失樣本
  2)多重插補(bǔ)法----通過變量之間的關(guān)系對(duì)缺失數(shù)據(jù)進(jìn)行預(yù)測(cè)摸吠,利用蒙特卡洛方法生成多個(gè)完整的數(shù)據(jù)集,在對(duì)這些數(shù)據(jù)集進(jìn)行分析嚎花,最后對(duì)分析結(jié)果進(jìn)行匯總處理
  3)熱平臺(tái)插補(bǔ)----指在非缺失數(shù)據(jù)集中找到一個(gè)與缺失值所在樣本相似的樣本(匹配樣本)寸痢,利用其中的觀測(cè)值對(duì)缺失值進(jìn)行插補(bǔ)。
    優(yōu)點(diǎn):簡(jiǎn)單易行紊选,準(zhǔn)去率較高
    缺點(diǎn):變量數(shù)量較多時(shí)啼止,通常很難找到與需要插補(bǔ)樣本完全相同的樣本。但我們可以按照某些變量將數(shù)據(jù)分層兵罢,在層中對(duì)缺失值實(shí)用均值插補(bǔ)
  4)拉格朗日差值法和牛頓插值法(簡(jiǎn)單高效献烦,數(shù)值分析里的內(nèi)容,數(shù)學(xué)公式以后再補(bǔ) = =)

5.建模法
可以用回歸卖词、使用貝葉斯形式化方法的基于推理的工具或決策樹歸納確定巩那。例如,利用數(shù)據(jù)集中其他數(shù)據(jù)的屬性此蜈,可以構(gòu)造一棵判定樹即横,來(lái)預(yù)測(cè)缺失值的值。

以上方法各有優(yōu)缺點(diǎn)裆赵,具體情況要根據(jù)實(shí)際數(shù)據(jù)分分布情況令境、傾斜程度、缺失值所占比例等等來(lái)選擇方法顾瞪。一般而言舔庶,建模法是比較常用的方法抛蚁,它根據(jù)已有的值來(lái)預(yù)測(cè)缺失值,準(zhǔn)確率更高惕橙。

三.異常值處理
  異常值我們通常也稱為“離群點(diǎn)”瞧甩。在講分析數(shù)據(jù)時(shí),我們舉了個(gè)例子說明如何發(fā)現(xiàn)離群點(diǎn)弥鹦,除了畫圖(畫圖其實(shí)并不常用肚逸,因?yàn)閿?shù)據(jù)量多時(shí)不好畫圖,而且慢)彬坏,還有很多其他方法:

1.簡(jiǎn)單的統(tǒng)計(jì)分析
  拿到數(shù)據(jù)后可以對(duì)數(shù)據(jù)進(jìn)行一個(gè)簡(jiǎn)單的描述性統(tǒng)計(jì)分析朦促,譬如最大最小值可以用來(lái)判斷這個(gè)變量的取值是否超過了合理的范圍,如客戶的年齡為-20歲或200歲栓始,顯然是不合常理的务冕,為異常值。
在python中可以直接用pandas的describe():

 1 >>> import pandas as pd 
2 >>> data = pd.read_table("web_traffic.tsv",header = None) 
3 >>> data.describe() 
4 0 1 
5 count 743.000000 735.000000 
6 mean 372.000000 1962.165986 
7 std 214.629914 860.720997 
8 min 1.000000 472.000000 
9 25% 186.500000 1391.00000010 50% 372.000000 1764.00000011 75% 557.500000 2217.50000012 max 743.000000 5906.000000

2.3?原則
  如果數(shù)據(jù)服從正態(tài)分布幻赚,在3?原則下禀忆,異常值為一組測(cè)定值中與平均值的偏差超過3倍標(biāo)準(zhǔn)差的值。如果數(shù)據(jù)服從正態(tài)分布落恼,距離平均值3?之外的值出現(xiàn)的概率為P(|x-u| > 3?) <= 0.003箩退,屬于極個(gè)別的小概率事件。如果數(shù)據(jù)不服從正態(tài)分布佳谦,也可以用遠(yuǎn)離平均值的多少倍標(biāo)準(zhǔn)差來(lái)描述戴涝。

3.箱型圖分析
  箱型圖提供了識(shí)別異常值的一個(gè)標(biāo)準(zhǔn):如果一個(gè)值小于QL01.5IQR或大于OU-1.5IQR的值,則被稱為異常值钻蔑。QL為下四分位數(shù)啥刻,表示全部觀察值中有四分之一的數(shù)據(jù)取值比它小矢棚;QU為上四分位數(shù)郑什,表示全部觀察值中有四分之一的數(shù)據(jù)取值比它大;IQR為四分位數(shù)間距蒲肋,是上四分位數(shù)QU與下四分位數(shù)QL的差值蘑拯,包含了全部觀察值的一半。箱型圖判斷異常值的方法以四分位數(shù)和四分位距為基礎(chǔ)兜粘,四分位數(shù)具有魯棒性:25%的數(shù)據(jù)可以變得任意遠(yuǎn)并且不會(huì)干擾四分位數(shù)申窘,所以異常值不能對(duì)這個(gè)標(biāo)準(zhǔn)施加影響。因此箱型圖識(shí)別異常值比較客觀孔轴,在識(shí)別異常值時(shí)有一定的優(yōu)越性剃法。

4.基于模型檢測(cè)
  首先建立一個(gè)數(shù)據(jù)模型,異常是那些同模型不能完美擬合的對(duì)象路鹰;如果模型是簇的集合贷洲,則異常是不顯著屬于任何簇的對(duì)象收厨;在使用回歸模型時(shí),異常是相對(duì)遠(yuǎn)離預(yù)測(cè)值的對(duì)象
優(yōu)缺點(diǎn):1.有堅(jiān)實(shí)的統(tǒng)計(jì)學(xué)理論基礎(chǔ)优构,當(dāng)存在充分的數(shù)據(jù)和所用的檢驗(yàn)類型的知識(shí)時(shí)诵叁,這些檢驗(yàn)可能非常有效;2.對(duì)于多元數(shù)據(jù)钦椭,可用的選擇少一些拧额,并且對(duì)于高維數(shù)據(jù),這些檢測(cè)可能性很差彪腔。

5.基于距離
  通辰慕酰可以在對(duì)象之間定義鄰近性度量,異常對(duì)象是那些遠(yuǎn)離其他對(duì)象的對(duì)象
優(yōu)缺點(diǎn):1.簡(jiǎn)單德挣;2.缺點(diǎn):基于鄰近度的方法需要O(m2)時(shí)間恭垦,大數(shù)據(jù)集不適用;3.該方法對(duì)參數(shù)的選擇也是敏感的盲厌;4.不能處理具有不同密度區(qū)域的數(shù)據(jù)集署照,因?yàn)樗褂萌珠撝祷隼幔荒芸紤]這種密度的變化吗浩。

6.基于密度
  當(dāng)一個(gè)點(diǎn)的局部密度顯著低于它的大部分近鄰時(shí)才將其分類為離群點(diǎn)。適合非均勻分布的數(shù)據(jù)没隘。
優(yōu)缺點(diǎn):1.給出了對(duì)象是離群點(diǎn)的定量度量懂扼,并且即使數(shù)據(jù)具有不同的區(qū)域也能夠很好的處理;2.與基于距離的方法一樣右蒲,這些方法必然具有O(m2)的時(shí)間復(fù)雜度阀湿。對(duì)于低維數(shù)據(jù)使用特定的數(shù)據(jù)結(jié)構(gòu)可以達(dá)到O(mlogm);3.參數(shù)選擇困難瑰妄。雖然算法通過觀察不同的k值陷嘴,取得最大離群點(diǎn)得分來(lái)處理該問題,但是间坐,仍然需要選擇這些值的上下界灾挨。

7.基于聚類:
  基于聚類的離群點(diǎn):一個(gè)對(duì)象是基于聚類的離群點(diǎn),如果該對(duì)象不強(qiáng)屬于任何簇竹宋。離群點(diǎn)對(duì)初始聚類的影響:如果通過聚類檢測(cè)離群點(diǎn)劳澄,則由于離群點(diǎn)影響聚類,存在一個(gè)問題:結(jié)構(gòu)是否有效蜈七。為了處理該問題秒拔,可以使用如下方法:對(duì)象聚類,刪除離群點(diǎn)飒硅,對(duì)象再次聚類(這個(gè)不能保證產(chǎn)生最優(yōu)結(jié)果)砂缩。
優(yōu)缺點(diǎn):1.基于線性和接近線性復(fù)雜度(k均值)的聚類技術(shù)來(lái)發(fā)現(xiàn)離群點(diǎn)可能是高度有效的作谚;2.簇的定義通常是離群點(diǎn)的補(bǔ),因此可能同時(shí)發(fā)現(xiàn)簇和離群點(diǎn)庵芭;3.產(chǎn)生的離群點(diǎn)集和它們的得分可能非常依賴所用的簇的個(gè)數(shù)和數(shù)據(jù)中離群點(diǎn)的存在性食磕;4.聚類算法產(chǎn)生的簇的質(zhì)量對(duì)該算法產(chǎn)生的離群點(diǎn)的質(zhì)量影響非常大。

處理方法:
1.刪除異常值----明顯看出是異常且數(shù)量較少可以直接刪除
2.不處理---如果算法對(duì)異常值不敏感則可以不處理喳挑,但如果算法對(duì)異常值敏感彬伦,則最好不要用,如基于距離計(jì)算的一些算法伊诵,包括kmeans单绑,knn之類的。
3.平均值替代----損失信息小曹宴,簡(jiǎn)單高效搂橙。
4.視為缺失值----可以按照處理缺失值的方法來(lái)處理

四.去重處理
以DataFrame數(shù)據(jù)格式為例:

 1 #創(chuàng)建數(shù)據(jù),data里包含重復(fù)數(shù)據(jù)
 2 >>> data = pd.DataFrame({'v1':['a']*5+['b']* 4,'v2':[1,2,2,2,3,4,4,5,3]}) 
3 >>> data 
4  v1 v2 
5 0 a 1 
6 1 a 2 
7 2 a 2 
8 3 a 2 
9 4 a 3
10 5 b 4
11 6 b 4
12 7 b 5
13 8 b 3
14 
15 #DataFrame的duplicated方法返回一個(gè)布爾型Series笛坦,表示各行是否是重復(fù)行
16 >>> data.duplicated()
17 0 False
18 1 False
19 2 True
20 3 True
21 4 False
22 5 False
23 6 True
24 7 False
25 8 False
26 dtype: bool
27 
28 #drop_duplicates方法用于返回一個(gè)移除了重復(fù)行的DataFrame
29 >>> data.drop_duplicates()
30  v1 v2
31 0 a 1
32 1 a 2
33 4 a 3
34 5 b 4
35 7 b 5
36 8 b 3
37 
38 #這兩個(gè)方法默認(rèn)會(huì)判斷全部列区转,你也可以指定部分列進(jìn)行重復(fù)項(xiàng)判斷。假設(shè)你還有一列值版扩,且只希望根據(jù)v1列過濾重復(fù)項(xiàng):
39 >>> data['v3']=range(9)
40 >>> data
41  v1 v2 v3
42 0 a 1 0
43 1 a 2 1
44 2 a 2 2
45 3 a 2 3
46 4 a 3 4
47 5 b 4 5
48 6 b 4 6
49 7 b 5 7
50 8 b 3 8
51 >>> data.drop_duplicates(['v1'])
52  v1 v2 v3
53 0 a 1 0
54 5 b 4 5
55 
56 #duplicated和drop_duplicates默認(rèn)保留的是第一個(gè)出現(xiàn)的值組合废离。傳入take_last=True則保留最后一個(gè):
57 >>> data.drop_duplicates(['v1','v2'],take_last = True)
58  v1 v2 v3
59 0 a 1 0
60 3 a 2 3
61 4 a 3 4
62 6 b 4 6
63 7 b 5 7
64 8 b 3 8

如果數(shù)據(jù)是列表格式的,有以下幾種方法可以刪除:

 1 list0=['b','c', 'd','b','c','a','a'] 
2  
3 方法1:使用set() 
4  
5 list1=sorted(set(list0),key=list0.index) # sorted output 
6 print( list1) 
7  
8 方法2:使用 {}.fromkeys().keys() 
9 
10 list2={}.fromkeys(list0).keys()
11 print(list2)
12 
13 方法3:set()+sort()
14 
15 list3=list(set(list0))
16 list3.sort(key=list0.index)
17 print(list3)
18 
19 方法4:迭代
20 
21 list4=[]
22 for i in list0:
23 if not i in list4:
24  list4.append(i)
25 print(list4)
26 
27 方法5:排序后比較相鄰2個(gè)元素的數(shù)據(jù)礁芦,重復(fù)的刪除
28 
29 def sortlist(list0):
30  list0.sort()
31 last=list0[-1]
32 for i in range(len(list0)-2,-1,-1):
33 if list0[i]==last:
34  list0.remove(list0[i])
35 else:
36 last=list0[i]
37 return list0
38 
39 print(sortlist(list0))

** 五.噪音處理**
  噪音蜻韭,是被測(cè)量變量的隨機(jī)誤差或方差。我們?cè)谏衔闹刑岬竭^異常點(diǎn)(離群點(diǎn))柿扣,那么離群點(diǎn)和噪音是不是一回事呢肖方?我們知道,觀測(cè)量(Measurement) = 真實(shí)數(shù)據(jù)(True Data) + 噪聲 (Noise)未状。離群點(diǎn)(Outlier)屬于觀測(cè)量俯画,既有可能是真實(shí)數(shù)據(jù)產(chǎn)生的,也有可能是噪聲帶來(lái)的司草,但是總的來(lái)說是和大部分觀測(cè)量之間有明顯不同的觀測(cè)值艰垂。。噪音包括錯(cuò)誤值或偏離期望的孤立點(diǎn)值翻伺,但也不能說噪聲點(diǎn)包含離群點(diǎn)材泄,雖然大部分?jǐn)?shù)據(jù)挖掘方法都將離群點(diǎn)視為噪聲或異常而丟棄。然而吨岭,在一些應(yīng)用(例如:欺詐檢測(cè))拉宗,會(huì)針對(duì)離群點(diǎn)做離群點(diǎn)分析或異常挖掘。而且有些點(diǎn)在局部是屬于離群點(diǎn),但從全局看是正常的旦事。
  我在quora上看到過一個(gè)解釋噪音與離群點(diǎn)的有趣的例子:
Outlier: you are enumerating meticulously everything you have. You found 3 dimes, 1 quarter and wow a 100 USD bill you had put there last time you bought some booze and had totally forgot there. The 100 USD bill is an outlier, as it's not commonly expected in a pocket.Noise: you have just come back from that club and are pretty much wasted. You try to find some money to buy something to sober up, but you have trouble reading the figures correctly on the coins. You found 3 dimes, 1 quarter and wow a 100 USD bill. But in fact, you have mistaken the quarter for a dime: this mistake introduces noise in the data you have access to.To put it otherwise, data = true signal + noise. Outliers are part of the data.

翻譯過來(lái)就是:
離群點(diǎn): 你正在從口袋的零錢包里面窮舉里面的錢魁巩,你發(fā)現(xiàn)了3個(gè)一角,1個(gè)五毛姐浮,和一張100元的毛爺爺向你微笑谷遂。這個(gè)100元就是個(gè)離群點(diǎn),因?yàn)椴⒉粦?yīng)該常出現(xiàn)在口袋里..噪聲: 你晚上去三里屯喝的酩酊大醉卖鲤,很需要買點(diǎn)東西清醒清醒肾扰,這時(shí)候你開始翻口袋的零錢包,嘛蛋逾,你發(fā)現(xiàn)了3個(gè)一角集晚,1個(gè)五毛,和一張100元的毛爺爺向你微笑区匣。但是你突然眼暈偷拔,把那三個(gè)一角看成了三個(gè)1元...這樣錯(cuò)誤的判斷使得數(shù)據(jù)集中出現(xiàn)了噪聲

那么對(duì)于噪音我們應(yīng)該如何處理呢?有以下幾種方法:
1.分箱法
分箱方法通過考察數(shù)據(jù)的“近鄰”(即亏钩,周圍的值)來(lái)光滑有序數(shù)據(jù)值莲绰。這些有序的值被分布到一些“桶”或箱中。由于分箱方法考察近鄰的值姑丑,因此它進(jìn)行局部光滑蛤签。
用箱均值光滑:箱中每一個(gè)值被箱中的平均值替換。
用箱中位數(shù)平滑:箱中的每一個(gè)值被箱中的中位數(shù)替換彻坛。
用箱邊界平滑:箱中的最大和最小值同樣被視為邊界顷啼。箱中的每一個(gè)值被最近的邊界值替換踏枣。

一般而言昌屉,寬度越大,光滑效果越明顯茵瀑。箱也可以是等寬的间驮,其中每個(gè)箱值的區(qū)間范圍是個(gè)常量。分箱也可以作為一種離散化技術(shù)使用.
2. 回歸法
  可以用一個(gè)函數(shù)擬合數(shù)據(jù)來(lái)光滑數(shù)據(jù)马昨。線性回歸涉及找出擬合兩個(gè)屬性(或變量)的“最佳”直線竞帽,使得一個(gè)屬性能夠預(yù)測(cè)另一個(gè)。多線性回歸是線性回歸的擴(kuò)展鸿捧,它涉及多于兩個(gè)屬性屹篓,并且數(shù)據(jù)擬合到一個(gè)多維面。使用回歸匙奴,找出適合數(shù)據(jù)的數(shù)學(xué)方程式堆巧,能夠幫助消除噪聲。

六.一些實(shí)用的數(shù)據(jù)處理小工具
1.去掉文件中多余的空行
空行主要指的是(\n,\r,\r\n,\n\r等),在python中有個(gè)strip()的方法谍肤,該方法可以去掉字符串兩端多余的“空白”啦租,此處的空白主要包括空格,制表符(\t)荒揣,換行符篷角。不過親測(cè)以后發(fā)現(xiàn),strip()可以匹配掉\n,\r\n,\n\r等系任,但是過濾不掉單獨(dú)的\r恳蹲。為了萬(wàn)無(wú)一失,我還是喜歡用麻煩的辦法俩滥,如下:

 1 #-*- coding :utf-8 -*-  2 #文本格式化處理阱缓,過濾掉空行 3  4 file = open('123.txt') 5  6 i = 0 7 while 1: 8 line = file.readline().strip() 9 if not line:10 break11 i = i + 112 line1 = line.replace('\r','')13 f1 = open('filename.txt','a')14 f1.write(line1 + '\n')15  f1.close()16 print str(i)

2.如何判斷文件的編碼格式

 1 #-*- coding:utf8 -*- 2 #批量處理編碼格式轉(zhuǎn)換(優(yōu)化) 3 import os 4 import chardet 5  6 path1 = 'E://2016txtutf/' 7 def dirlist(path): 8 filelist = os.listdir(path) 9 for filename in filelist:10 filepath = os.path.join(path, filename)11 if os.path.isdir(filepath):12  dirlist(filepath)13 else:14 if filepath.endswith('.txt'):15 f = open(filepath)16 data = f.read()17 if chardet.detect(data)['encoding'] != 'utf-8':18 print filepath + "----"+ chardet.detect(data)['encoding']19 20 dirlist(path1)

3.文件編碼格式轉(zhuǎn)換,gbk與utf-8之間的轉(zhuǎn)換
這個(gè)主要是在一些對(duì)文件編碼格式有特殊需求的時(shí)候举农,需要批量將gbk的轉(zhuǎn)utf-8的或者將utf-8編碼的文件轉(zhuǎn)成gbk編碼格式的荆针。

 1 #-*- coding:gbk -*-  2 #批量處理編碼格式轉(zhuǎn)換 3 import codecs 4 import os 5 path1 = 'E://dir/' 6 def ReadFile(filePath,encoding="utf-8"): 7 with codecs.open(filePath,"r",encoding) as f: 8 return f.read() 9 10 def WriteFile(filePath,u,encoding="gbk"):11 with codecs.open(filePath,"w",encoding) as f:12  f.write(u)13 14 def UTF8_2_GBK(src,dst):15 content = ReadFile(src,encoding="utf-8")16 WriteFile(dst,content,encoding="gbk")17 18 def GBK_2_UTF8(src,dst):19 content = ReadFile(src,encoding="gbk")20 WriteFile(dst,content,encoding="utf-8")21 22 def dirlist(path):23 filelist = os.listdir(path)24 for filename in filelist:25 filepath = os.path.join(path, filename)26 if os.path.isdir(filepath):27  dirlist(filepath)28 else:29 if filepath.endswith('.txt'):30 print filepath31 #os.rename(filepath, filepath.replace('.txt','.doc'))32 try:33  UTF8_2_GBK(filepath,filepath)34 except Exception,ex:35 f = open('error.txt','a')36 f.write(filepath + '\n')37  f.close()38 39 dirlist(path1)

參考文獻(xiàn):
1.http://blog.csdn.net/u012950655/article/details/16946021
2.http://my.oschina.net/dfsj66011/blog/601546
3.http://www.cnblogs.com/nzyjlr/p/4174145.html
4.https://www.quora.com/What-is-the-basic-difference-between-noise-and-outliers-in-Data-mining
6.《數(shù)據(jù)挖掘:概念與技術(shù)》,Jiawei Han Micheline Kamber Jian Pei

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颁糟,一起剝皮案震驚了整個(gè)濱河市航背,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棱貌,老刑警劉巖玖媚,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婚脱,居然都是意外死亡今魔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門障贸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)错森,“玉大人,你說我怎么就攤上這事篮洁∩” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵袁波,是天一觀的道長(zhǎng)瓦阐。 經(jīng)常有香客問我,道長(zhǎng)篷牌,這世上最難降的妖魔是什么睡蟋? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮枷颊,結(jié)果婚禮上戳杀,老公的妹妹穿的比我還像新娘叫倍。我一直安慰自己,他們只是感情好豺瘤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布吆倦。 她就那樣靜靜地躺著,像睡著了一般坐求。 火紅的嫁衣襯著肌膚如雪蚕泽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天桥嗤,我揣著相機(jī)與錄音须妻,去河邊找鬼。 笑死泛领,一個(gè)胖子當(dāng)著我的面吹牛荒吏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渊鞋,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼绰更,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锡宋?” 一聲冷哼從身側(cè)響起儡湾,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎执俩,沒想到半個(gè)月后徐钠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡役首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年尝丐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衡奥。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爹袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杰赛,到底是詐尸還是另有隱情呢簸,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布乏屯,位于F島的核電站,受9級(jí)特大地震影響瘦赫,放射性物質(zhì)發(fā)生泄漏辰晕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一确虱、第九天 我趴在偏房一處隱蔽的房頂上張望含友。 院中可真熱鬧,春花似錦、人聲如沸窘问。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惠赫。三九已至把鉴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儿咱,已是汗流浹背庭砍。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留混埠,地道東北人怠缸。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钳宪,于是被迫代替她去往敵國(guó)和親揭北。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容