數(shù)據(jù)挖掘的核心是什么?這個(gè)的答案是算法應(yīng)該沒(méi)什么疑問(wèn)。那數(shù)據(jù)挖掘的基石又是什么呢?那就是今天我們要來(lái)說(shuō)的數(shù)據(jù)預(yù)處理。
什么是數(shù)據(jù)預(yù)處理?
數(shù)據(jù)科學(xué)家們一直想為數(shù)據(jù)預(yù)處理賦予一個(gè)定義。其實(shí)簡(jiǎn)單地說(shuō),數(shù)據(jù)預(yù)處理就是一種數(shù)據(jù)挖掘技術(shù),本質(zhì)就是為了將原始數(shù)據(jù)轉(zhuǎn)換為可以理解的格式或者符合我們挖掘的格式。
為什么需要數(shù)據(jù)預(yù)處理?
在真實(shí)世界中,數(shù)據(jù)通常是不完整的(缺少某些感興趣的屬性值)、不一致的(包含代碼或者名稱的差異)、極易受到噪聲(錯(cuò)誤或異常值)的侵?jǐn)_的。因?yàn)閿?shù)據(jù)庫(kù)太大,而且數(shù)據(jù)集經(jīng)常來(lái)自多個(gè)異種數(shù)據(jù)源,低質(zhì)量的數(shù)據(jù)將導(dǎo)致低質(zhì)量的挖掘結(jié)果。就像一個(gè)大廚現(xiàn)在要做美味的蒸魚(yú),如果不將魚(yú)進(jìn)行去鱗等處理,一定做不成我們口中美味的魚(yú)。
數(shù)據(jù)預(yù)處理就是解決上面所提到的數(shù)據(jù)問(wèn)題的可靠方法。
那它是怎么做到的呢?
就像大廚準(zhǔn)備處理魚(yú)的刀具一樣,數(shù)據(jù)預(yù)處理也是如此。它準(zhǔn)備原始數(shù)據(jù)以便進(jìn)一步處理。下面是數(shù)據(jù)預(yù)處理要采取的步驟,如圖:
數(shù)據(jù)清洗: 填寫(xiě)缺失的值,光滑噪聲數(shù)據(jù),識(shí)別或刪除離群點(diǎn),并解決不一致性來(lái)“清理數(shù)據(jù)”;
數(shù)據(jù)集成:使用多個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)立方體或文件;
數(shù)據(jù)歸約: 用替代的,較小的數(shù)據(jù)表示形式替換元數(shù)據(jù),得到信息內(nèi)容的損失最小化,方法包括維規(guī)約,數(shù)量規(guī)約和數(shù)據(jù)壓縮;
數(shù)據(jù)變換:將數(shù)據(jù)變換成使用挖掘的形式。
下面這張圖很形象得把這四個(gè)步驟的作用表現(xiàn)出來(lái),挺有意思的。
應(yīng)用
是時(shí)候采取一些簡(jiǎn)單的實(shí)際應(yīng)用來(lái)了解數(shù)據(jù)預(yù)處理是如何完成的。
下面的例子我們用 Python 來(lái)處理,還需要用到兩個(gè)庫(kù),分別是 Numpy、Pandas。
準(zhǔn)備數(shù)據(jù)
在這里,我們有一個(gè)數(shù)據(jù)集,其中包括IT專業(yè)人員的信息,比如國(guó)家、工資、性別,如下:
我們可以隨意創(chuàng)建此數(shù)據(jù)集的副本。
我們可以觀察到上面的數(shù)據(jù)集包含一些空值,這是故意的。后面很快可以看到它發(fā)揮的作用
導(dǎo)入庫(kù)
簡(jiǎn)單說(shuō)下 Numpy、Pandas 這兩個(gè)庫(kù)的作用:Numpy 庫(kù)包含數(shù)學(xué)工具,它可以用于在我們代碼中的任何類型的數(shù)學(xué);Pandas 庫(kù)用于導(dǎo)入和管理數(shù)據(jù)集。
下面是我們導(dǎo)入庫(kù)的方法:
import pandas as pd
import numpy as np
導(dǎo)入數(shù)據(jù)集
我們已經(jīng)導(dǎo)入庫(kù)了,接下來(lái)我們需要獲取數(shù)據(jù)集。在我本地里,我將我的數(shù)據(jù)集文件命名為‘profess’,它的格式為.csv。
#讀取數(shù)據(jù)(我的數(shù)據(jù)集文件跟我的python文件在同一目錄下)
data = pd.read_csv('profess.csv')
導(dǎo)入數(shù)據(jù)集后,我們輸出看下它的格式如何:
print(data)
Good!我們成功得將數(shù)據(jù)集導(dǎo)入測(cè)試環(huán)境中。
數(shù)據(jù)清洗——查看缺失值
為了成功管理數(shù)據(jù),缺失值的概念很重要。如果工程師沒(méi)有正確處理缺失值,可能最后得出關(guān)于數(shù)據(jù)的推斷是不準(zhǔn)確的。我們?cè)賮?lái)仔細(xì)看下我們的數(shù)據(jù)的缺失值情況,用 Pandas 庫(kù)的 isnull 函數(shù)來(lái)看看。
print(data.isnull().sum())
我們可以發(fā)現(xiàn) Age,Salary 列都有缺失值(就是為空的值),缺失值數(shù)量都為1。處理缺失值有7種處理方法,我們這里說(shuō)說(shuō)比較常用的兩種。
1、此方法經(jīng)常用于處理空值,如果某行有特定特征d的空值,就刪除此行。如果特定列具有超過(guò)75%的缺失值,就刪除特定列。不過(guò)我們要在確保樣本數(shù)據(jù)足夠多的情況下,采用這個(gè)方法。因?yàn)槲覀円_保刪除數(shù)據(jù)后,不會(huì)增加偏差。
data.dropna(inplace=True)
print(data.isnull().sum())
2、這個(gè)方法適用于具有年份或者年齡,金額等數(shù)字?jǐn)?shù)據(jù)的功能。我們可以計(jì)算特征的均值,中值或眾數(shù),將其替換為缺失值。與第一種方法相比,這種可以抵消數(shù)據(jù)的缺失,產(chǎn)生更好的效果。
我們用來(lái)看一下操作:
# 將 Age 列中為空的值替換為 Age 的中位數(shù)。
# medain()是 pandas 庫(kù)的求中位數(shù)的方法
data['Age'] = data['Age']
.replace(np.NaN,data['Age']
.median())
print(data['Age'])
我們成功替換掉了。
數(shù)據(jù)歸約
為了滿足挖掘需求,我們需要知道這些工程師們的薪水分布區(qū)間,但是我們只有‘Salary’ 薪水這一列,所以為了方便挖掘,我們給我們的數(shù)據(jù)集增加‘薪水等級(jí)’ level 這一列,通過(guò) Salary 列進(jìn)行區(qū)間歸約,這種方法叫做“屬性構(gòu)造”。我們看看操作:
#數(shù)據(jù)歸約
def section(d):
if 50000 > d:
return '50000以下'
if 100000 > d >= 5000:
return '50000-100000'
if d > 100000:
return '100000以上'
data['level'] = data['Salary']
.apply(lambda x: section(x))
print(data['level'])
我們定義一個(gè)‘?dāng)?shù)據(jù)變換’的函數(shù)給,根據(jù) Salary 判斷選擇區(qū)間進(jìn)行變換并賦值給 level。
數(shù)據(jù)變換
我們可以看到 Salary 列也有空值,從業(yè)務(wù)上理解它應(yīng)該是數(shù)字?jǐn)?shù)值才是。但是我們發(fā)現(xiàn)我們的數(shù)據(jù)集中是貨幣格式,我們需要對(duì)它進(jìn)行‘?dāng)?shù)據(jù)變換’,轉(zhuǎn)換成我們所需的數(shù)字格式。來(lái)看下實(shí)際操作:
#數(shù)據(jù)變換
def convert_currency(d):
new_value = str(d).replace(',','')
.replace('$','')
return float(new_value)
data['Salary'] = data['Salary'].apply(convert_currency)
# mean()是 pandas 庫(kù)的求平均值的方法
data['Salary'] = data['Salary']
.replace(np.NaN,data['Salary']
.mean())
print(data['Salary'])
變換成功:
我們定義一個(gè)“數(shù)據(jù)變換”的函數(shù),然后將它應(yīng)用再 Salary 列上,最后同數(shù)據(jù)清洗那一步同樣的替換操作,我們這里用平均值替換。
寫(xiě)在最后
至此我們算走完數(shù)據(jù)預(yù)處理的一個(gè)基本流程。
這是比較基礎(chǔ)的一個(gè)小應(yīng)用,但是相信我們以后處理數(shù)據(jù)的時(shí)候能有一個(gè)基本清晰的解決思路,以及如何選擇處理方法以及為什么選擇有所了解。
數(shù)據(jù)挖掘一路走來(lái)也有幾十年的歷史了,數(shù)據(jù)預(yù)處理每個(gè)步驟都開(kāi)發(fā)出很多的方法。由于不一致或臟數(shù)據(jù)的數(shù)量巨大,以及問(wèn)題本身的復(fù)雜性,數(shù)據(jù)預(yù)處理仍然是一個(gè)活躍的研究領(lǐng)域。篇幅所限,無(wú)法一一敘述,以后會(huì)再深入。
作者:邱雅婷,就職于信用行業(yè)的互聯(lián)網(wǎng)公司,數(shù)據(jù)工程師,愛(ài)好讀書(shū),思考。本文為作者投稿,版權(quán)歸其個(gè)人所有。
聯(lián)系客服