优达笔记-安然数据分析 异常值处理
安然事件,作為美國最大的欺詐案,也是破產案,不僅在經濟法律領域有很重要的意義,它所保留下來的關于高管及員工的工資、郵件、股權等等的真實數據對于想要學習機器學習的人來說也是非常好的材料
上一篇文章我們講了如何查看數據,包括查看這些數據有那些特征,每個人的數據是什么,如何查看NaN值等,需要回歸的可以再看兩眼哦[機器學習] 美國最大欺詐案—對安然事件數據集的分析(一)
本篇文章主要是對安然事件數據的異常值進行分析
我們采用的方法是運行回歸,然后識別并刪除具有最大殘差的 10% 的點。然后,從數據集中刪除那些異常值并重新擬合回歸(對這個方法不明白的童鞋請看[機器學習] 遇到異常值怎么辦?)
對異常值不做處理的回歸
打開\ud120-projects\outliers\outlier_removal_regression.py
 這個python文件已經包含了數據載入和可視化的代碼,需要填寫的就是一個線性回歸的代碼(線性回歸不了解的童鞋請看[機器學習] 最實用的算法:回歸)
注意由于sklearn的升級,棄用了.cross_validation模塊,所以還需要改一行代碼:
###23行的from sklearn.cross_validation import train_test_split改為: from sklearn.model_selection import train_test_split你可以通過下面的代碼來查看未經異常值處理的斜率和R2值:
print "Slope is:",reg.coef_print "R^2 for testing data is:",reg.score(ages_test,net_worths_test)此時的斜率是5.078,R2為0.878
對異常值處理之后的回歸
打開\ud120-projects\outliers\outlier_cleaner.py 中找到 outlierCleaner() 函數的骨架并向其填充清理算法。
到的三個參數是:predictions 是一個列表,包含回歸的預測目標;ages 也是一個列表,包含訓練集內的年齡;net_worths 是訓練集內凈值的實際值。每個列表中應有 90 個元素(因為訓練集內有 90 個點)。你的工作是返回一個名叫cleaned_data 的列表,該列表中只有 81 個元素,也即預測值和實際值 (net_worths) 具有最小誤差的 81 個訓練點 (90 * 0.9 = 81)。cleaned_data 的格式應為一個元組列表,其中每個元組的形式均為 (age, net_worth, error)。一旦此清理函數運行起來,你應該能看到回歸結果發生了變化。新斜率是多少?是否更為接近 6.25 這個“正確”結果?
這是我的答案
cleaned_data=[]e=abs(predictions-net_worths)cleaned_data=zip(ages,net_worths,e)cleaned_data=sorted(cleaned_data,key=lambda clean:clean[2])clean_num=int(math.ceil(len(cleaned_data)*0.9))cleaned_data=cleaned_data[:clean_num]
 會發現,經過異常處理之后,斜率變成了6.37,R2為0.983
安然異常值的可視化
這次我們分析的不是"年齡”和“收入”了,而是“工資”和“獎金",
你可以在 outliers/enron_outliers.py 中找到初始代碼,該代碼讀入數據(以字典形式)并將之轉換為適合 sklearn 的 numpy 數組。由于從字典中提取出了兩個特征(“工資”和“獎金”),得出的 numpy 數組維度將是 N x 2,其中 N 是數據點數,2 是特征數。對散點圖而言,這是非常完美的輸入;我們將使用 matplotlib.pyplot 模塊來繪制圖形。(在本課程中,我們對所有可視化均使用 pyplot。)將這些行添加至腳本底部,用以繪制散點圖
for point in data:salary = point[0]bonus = point[1]matplotlib.pyplot.scatter( salary, bonus )matplotlib.pyplot.xlabel("salary") matplotlib.pyplot.ylabel("bonus") matplotlib.pyplot.show()就會出現可視化的圖:
 
我們可以看到右上角有一個異常值,那么這個異常值是誰呢?怎么搜索它?可以排個序然后找到那個最大值:
max_value=sorted(data,reverse=True,key=lambda sal:sal[0])[0] print max_valuefor item in data_dict:if data_dict[item]['salary']==max_value[0]:print item然后會發現,這個異常值的key是 TOTAL,說明它是一個電子表格 bug,清除掉就可以了
清除的方法就是在調用 featureFormat() 之前寫下這樣的代碼:
data_dict.pop('TOTAL', 0 )即使是清除了異常值之后,仍然有一些數據看起來不是很合乎邏輯,我們認為還有 4 個異常值需要調查;舉例來看。兩人獲得了至少 5 百萬美元的獎金,以及超過 1 百萬美元的工資;換句話說,他們就像是強盜。怎么可以拿這么多錢呢?
用下面的代碼找到這兩個人:
for item in data_dict:if data_dict[item]['bonus']!='NaN' and data_dict[item]['salary']!='NaN':if data_dict[item]['bonus']>5e6 and data_dict[item]['salary']>1e6:print item發現這兩個人就是:LAY KENNETH L和SKILLING JEFFREY K,但是這兩個數據就不需要刪除了,因為他們并不是因為Excel的bug或者什么輸入錯誤,而是這兩個人可能非法拿到了很多錢,是非常重要的研究對象
OK,到此異常處理就結束了,是不是很有意思?
你的贊是對作者莫大的支持哦~?
如果你想看其他的關于機器學習的一些知識,可以關注我的知乎專欄,我是一個機器學習小白,初學者總會遇到各種各樣的困難,我會從初學者的角度把每一個坑都給你仔仔細細的講明白咯~
總結
以上是生活随笔為你收集整理的优达笔记-安然数据分析 异常值处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 数据结构习题及解析三
- 下一篇: python的encode方法_Pyth
