需要完整代碼和PPT請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言私信~~~
一、數(shù)據(jù)預(yù)處理的必要性
低質(zhì)量的數(shù)據(jù)導(dǎo)致低質(zhì)量的數(shù)據(jù)挖掘結(jié)果
數(shù)據(jù)是數(shù)據(jù)挖掘的目標(biāo)對(duì)象和原始資源,對(duì)數(shù)據(jù)挖掘最終結(jié)果起著決定性的作用?,F(xiàn)實(shí)世界中的數(shù)據(jù)是多種多樣的,具有不同的特征,這就要求數(shù)據(jù)的存儲(chǔ)采用合適的數(shù)據(jù)類型,并且數(shù)據(jù)挖掘算法的適用性會(huì)受到具體的數(shù)據(jù)類型限制。
現(xiàn)實(shí)世界中的數(shù)據(jù)大多都是“臟”的,原始數(shù)據(jù)通常存在著噪聲、不一致、部分?jǐn)?shù)據(jù)缺失等問題。
1:數(shù)據(jù)的不一致
各應(yīng)用系統(tǒng)的數(shù)據(jù)缺乏統(tǒng)一的標(biāo)準(zhǔn)和定義,數(shù)據(jù)結(jié)構(gòu)有較大的差異
2:?噪聲數(shù)據(jù)
收集數(shù)據(jù)時(shí)很難得到精確的數(shù)據(jù),如數(shù)據(jù)采集設(shè)備故障、數(shù)據(jù)傳輸過程中會(huì)出現(xiàn)錯(cuò)誤或存儲(chǔ)介質(zhì)可能出現(xiàn)的損壞等情況
3.:缺失值
系統(tǒng)設(shè)計(jì)時(shí)可能存在的缺陷或者在系統(tǒng)使用過程中人為因素的影響
數(shù)據(jù)質(zhì)量要求 數(shù)據(jù)挖掘需要的數(shù)據(jù)必須是高質(zhì)量的數(shù)據(jù),即數(shù)據(jù)挖掘所處理的數(shù)據(jù)必須具有準(zhǔn)確性(Correctness)、完整性(Completeness)和一致性(Consistency)等性質(zhì)。此外,時(shí)效性(Timeliness)、可信性(Believability)和可解釋性(Interpretability)也會(huì)影響數(shù)據(jù)的質(zhì)量。
二、數(shù)據(jù)清洗
現(xiàn)實(shí)世界中的數(shù)據(jù)一般是不完整的、有噪聲和不一致的“臟”數(shù)據(jù),數(shù)據(jù)清理試圖填充缺失的數(shù)據(jù)值、光滑噪聲、識(shí)別離群點(diǎn)并糾正數(shù)據(jù)中的不一致。
數(shù)據(jù)并不總是完整的
引起空缺值的原因
設(shè)備故障
和其他數(shù)據(jù)不一致可能被刪除
數(shù)據(jù)沒有被錄入
Missing data 需要經(jīng)過推斷而補(bǔ)上
1. 缺失值的處理
(1)忽略元組
(2)人工填寫缺失值
(3)使用一個(gè)全局常量填充缺失值
(4)使用屬性的中心度量(如均值或中位數(shù))填充缺失值
(5)使用與給定元組屬同一類的所有樣本的屬性均值或中位數(shù)
(6)使用最可能的值填充缺失值
2. 噪聲數(shù)據(jù)的處理
噪聲(Noise)是被測(cè)量的變量的隨機(jī)誤差或方差。噪聲的處理方法一般有分箱、回歸和離群點(diǎn)分析等方法、
(1)分箱 通過考察數(shù)據(jù)的近鄰來光滑有序數(shù)據(jù)值,這些有序的數(shù)據(jù)被劃分到一些桶或者箱子中
(2)回歸? 用一個(gè)函數(shù)擬合數(shù)據(jù)來光滑數(shù)據(jù)
(3)離群點(diǎn)分析 可以通過聚類等方法檢測(cè)離群點(diǎn)
利用Pandas進(jìn)行數(shù)據(jù)清洗?
利用isnull檢測(cè)缺失值
import pandas as pd
import numpy as np
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
print(string_data)
string_data.isnull()
Series中的None值處理
string_data = pd.Series(['aardvark', 'artichoke',np.nan, 'avocado'])
string_data.isnull()
利用isnull().sum()統(tǒng)計(jì)缺失值
df = pd.DataFrame(np.arange(12).reshape(3,4),columns = ['A','B','C','D'])
df.ix[2,:] = np.nan
df[3] = np.nan
print(df)
df.isnull().sum()
用info方法查看DataFrame的缺失值
df.info()
Series的dropna用法
from numpy import nan as NA
data = pd.Series([1, NA, 3.5, NA, 7])
print(data)
print(data.dropna())
布爾型索引選擇過濾非缺失值
not_null = data.notnull()
print(not_null)
print(data[not_null])
DataFrame對(duì)象的dropna默認(rèn)參數(shù)使用
from numpy import nan as NA
data = pd.DataFrame([[1., 5.5, 3.], [1., NA, NA],[NA, NA, NA],
[NA, 5.5, 3.]])
print(data)
cleaned = data.dropna()
print('刪除缺失值后的:\n',cleaned)
傳入?yún)?shù)all
data = pd.DataFrame([[1., 5.5, 3.], [1., NA, NA],[NA, NA, NA],
[NA, 5.5, 3.]])
print(data)
data.dropna(how='all')
dropna中的axis參數(shù)應(yīng)用
data = pd.DataFrame([[1., 5.5, NA], [1., NA, NA],[NA, NA, NA], [NA, 5.5, NA]])
print(data)
data.dropna(axis = 1, how = 'all')
dropna中的thresh參數(shù)應(yīng)用 要求一行至少N個(gè)非NAN時(shí)才能保留
df = pd.DataFrame(np.random.randn(7, 3))
df.iloc[:4, 1] = NA
df.iloc[:2, 2] = NA
print(df)
df.dropna(thresh=2)
填補(bǔ)缺失值
通過字典形式填充缺失值
df = pd.DataFrame(np.random.randn(5,3))
df.loc[:3,1] = NA
df.loc[:2,2] = NA
print(df)
df.fillna({1:0.88,2:0.66})
fillna中method的應(yīng)用
df = pd.DataFrame(np.random.randn(6, 3))
df.iloc[2:, 1] = NA
df.iloc[4:, 2] = NA
print(df)
df.fillna(method = 'ffill')
用Series的均值填充
data = pd.Series([1., NA, 3.5, NA, 7])
data.fillna(data.mean())
?DataFrame中用均值填充
df = pd.DataFrame(np.random.randn(4, 3))
df.iloc[2:, 1] = NA
df.iloc[3:, 2] = NA
print(df)
df[1] = df[1].fillna(df[1].mean())
print(df)
數(shù)據(jù)值替換
replace替換數(shù)據(jù)值
data = {'姓名':['張三','小明','馬芳','國志'],'性別':['0','1','0','1'],
'籍貫':['北京','甘肅','','上海']}
df = pd.DataFrame(data)
df = df.replace('','不詳')
print(df)
replace傳入列表實(shí)現(xiàn)多值替換
df = df.replace(['不詳','甘肅'],['蘭州','蘭州'])
print(df)
replace傳入字典實(shí)現(xiàn)多值替換
df = df.replace({'1':'男','0':'女'})
print(df)
利用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換
map方法映射數(shù)據(jù)
data = {'姓名':['張三','小明','馬芳','國志'],'性別':['0','1','0','1'],
'籍貫':['北京','蘭州','蘭州','上海']}
df = pd.DataFrame(data)
df['成績(jī)'] = [58,86,91,78]
print(df)
def grade(x):
if x>=90:
return '優(yōu)'
elif 70<=x<90:
return '良'
elif 60<=x<70:
return '中'
else:
return '差'
df['等級(jí)'] = df['成績(jī)'].map(grade)
print(df)
3. 數(shù)據(jù)異常值檢測(cè)
異常值是指數(shù)據(jù)中存在的數(shù)值明顯偏離其余數(shù)據(jù)的值。異常值的存在會(huì)嚴(yán)重干擾數(shù)據(jù)分析的結(jié)果,因此經(jīng)常要檢驗(yàn)數(shù)據(jù)中是否有輸入錯(cuò)誤或含有不合理的數(shù)據(jù)。在利用簡(jiǎn)單的數(shù)據(jù)統(tǒng)計(jì)方法中一般常用散點(diǎn)圖、箱線圖和3σ法則。
1) 散點(diǎn)圖方法
?
import pandas as pd
wdf = pd.DataFrame(np.arange(20),columns = ['W'])
wdf['Y'] = wdf['W']*1.5+2
wdf.iloc[3,1] = 128
wdf.iloc[18,1] = 150
wdf.plot(kind = 'scatter',x = 'W',y = 'Y')
2) 盒圖:利用箱線圖進(jìn)行異常值檢測(cè)時(shí),根據(jù)經(jīng)驗(yàn),將最大(最小)值設(shè)置為與四分位數(shù)值間距為1.5個(gè)IQR(IQR=Q3-Q2)的值,即min=Q1-1.5IQR,max=Q3+1.5IQR,小于min和大于max的值被認(rèn)為是異常值
import matplotlib.pyplot as plt
plt.boxplot(wdf['Y'].values,notch = True)
3) 3σ法則:若數(shù)據(jù)服從正態(tài)分布,在3σ原則下,異常值被定義為一組測(cè)定值中與平均值的偏差超過3倍標(biāo)準(zhǔn)差的值,因?yàn)樵谡龖B(tài)分布的假設(shè)下,距離平均值3σ之外的值出現(xiàn)的概率小于0.003。因此根據(jù)小概率事件,可以認(rèn)為超出3σ之外的值為異常數(shù)據(jù)。
函數(shù)定義代碼如下
def outRange(S):
blidx = (S.mean()-3*S.std()>S)|(S.mean()+3*S.std()<S)
idx = np.arange(S.shape[0])[blidx]
outRange = S.iloc[idx]
return outRange
outier = outRange(wdf['Y'])
outier
?三、數(shù)據(jù)集成
數(shù)據(jù)集成是將多個(gè)數(shù)據(jù)源中的數(shù)據(jù)合并,存放于一個(gè)一致的數(shù)據(jù)存儲(chǔ)中
數(shù)據(jù)集成過程中的關(guān)鍵問題
1. 實(shí)體識(shí)別
2. 數(shù)據(jù)冗余和相關(guān)分析
3.元組重復(fù)
4. 數(shù)據(jù)值沖突檢測(cè)與處理
1. 實(shí)體識(shí)別 實(shí)體識(shí)別問題是數(shù)據(jù)集成中的首要問題,因?yàn)閬碜远鄠€(gè)信息源的現(xiàn)實(shí)世界的等價(jià)實(shí)體才能匹配。如數(shù)據(jù)集成中如何判斷一個(gè)數(shù)據(jù)庫中的customer_id和另一數(shù)據(jù)庫中的cust_no是指相同的屬性?
2. 數(shù)據(jù)冗余和相關(guān)分析 冗余是數(shù)據(jù)集成的另一重要問題。如果一個(gè)屬性能由另一個(gè)或另一組屬性值“推導(dǎo)”出,則這個(gè)屬性可能是冗余的。屬性命名不一致也會(huì)導(dǎo)致結(jié)果數(shù)據(jù)集中的冗余。
?利用Python計(jì)算屬性間的相關(guān)性
import pandas as pd
import numpy as np
# a = [np.random.randint(0, 100) for a in range(20)]
# b = [random.randint(0, 100) for a in range(20)]
a=[47, 83, 81, 18, 72, 41, 50, 66, 47, 20, 96, 21, 16, 60, 37, 59, 22, 16, 32, 63]
b=[56, 96, 84, 21, 87, 67, 43, 64, 85, 67, 68, 64, 95, 58, 56, 75, 6, 11, 68, 63]
data=np.array([a, b]).T
dfab = pd.DataFrame(data, columns=['A', 'B'])
# display(dfab)
print('屬性A和B的協(xié)方差:',dfab.A.cov(dfab.B))
print('屬性A和B的相關(guān)系數(shù):',dfab.A.corr(dfab.B))
3.元組重復(fù)
除了檢查屬性的冗余之外,還要檢測(cè)重復(fù)的元組,如給定唯一的數(shù)據(jù)實(shí)體,存在兩個(gè)或多個(gè)相同的元組。 利用Pandas.DataFrame.duplicates方法檢測(cè)重復(fù)的數(shù)據(jù) 利用Pandas.DataFrame.drop_duplicates方法刪除重復(fù)的數(shù)據(jù)?
4. 數(shù)據(jù)值沖突檢測(cè)與處理
數(shù)據(jù)集成還涉及數(shù)據(jù)值沖突的檢測(cè)與處理。例如不同學(xué)校的學(xué)生交換信息時(shí),由于不同學(xué)校有各自的課程計(jì)劃和評(píng)分方案,同一門課的成績(jī)所采取的評(píng)分分?jǐn)?shù)也有可能不同,如十分制或百分制。
?利用Pandas合并數(shù)據(jù)
在實(shí)際的數(shù)據(jù)分析中,可能有不同的數(shù)據(jù)來源,因此,需要對(duì)數(shù)據(jù)進(jìn)行合并處理
merge的默認(rèn)合并數(shù)據(jù)
price = pd.DataFrame({'fruit':['apple','grape',
'orange','orange'],'price':[8,7,9,11]})
amount = pd.DataFrame({'fruit':['apple','grape',
'orange'],'amout':[5,11,8]})
display(price,amount,pd.merge(price,amount))
指定合并時(shí)的列名
display(pd.merge(price,amount,left_on = 'fruit',right_on = 'fruit'))
?左連接
display(pd.merge(price,amount,how = 'left'))
右連接
display(pd.merge(price,amount,how = 'right'))
merge通過多個(gè)鍵合并
left = pd.DataFrame({'key1':['one','one','two'],
'key2':['a','b','a'],'value1':range(3)})
right = pd.DataFrame({'key1':['one','one','two','two'],
'key2':['a','a','a','b'],'value2':range(4)})
display(left,right,pd.merge(left,right,on = ['key1','key2'],how = 'left'))
merge函數(shù)中參數(shù)suffixes的應(yīng)用 處理重復(fù)列名
print(pd.merge(left,right,on = 'key1'))
print(pd.merge(left,right,on = 'key1',suffixes = ('_left','_right')))
使用concat函數(shù)進(jìn)行數(shù)據(jù)連接
兩個(gè)Series的數(shù)據(jù)連接
s1 = pd.Series([0,1],index = ['a','b'])
s2 = pd.Series([2,3,4],index = ['a','d','e'])
s3 = pd.Series([5,6],index = ['f','g'])
print(pd.concat([s1,s2,s3])) #Series行合并
兩個(gè)DataFrame的數(shù)據(jù)連接
data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns = list('abc'))
data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns = list('ayz'))
data = pd.concat([data1,data2],axis = 0)
display(data1,data2,data)
?使用combine_first合并
如果需要合并的兩個(gè)DataFrame存在重復(fù)索引 那么需要使用以上這個(gè)函數(shù)合并
四、數(shù)據(jù)標(biāo)準(zhǔn)化
不同特征之間往往具有不同的量綱,由此造成數(shù)值間的差異很大。因此為了消除特征之間量綱和取值范圍的差異可能會(huì)造成的影響,需要對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理
數(shù)據(jù)標(biāo)準(zhǔn)化(Data Standardization)一直是一項(xiàng)重要的處理流程。一般將數(shù)據(jù)標(biāo)準(zhǔn)化放在預(yù)處理過程中,作為一項(xiàng)通用技術(shù)而存在
機(jī)器學(xué)習(xí)中有部分模型是基于距離度量進(jìn)行模型預(yù)測(cè)和分類的。由于距離對(duì)特征之間不同取值范圍非常敏感,所以基于距離讀量的模型是十分有必要做數(shù)據(jù)標(biāo)準(zhǔn)化處理的
離差標(biāo)準(zhǔn)化數(shù)據(jù)
離差標(biāo)準(zhǔn)化是對(duì)原始數(shù)據(jù)所做的一種線性變換,將原始數(shù)據(jù)的數(shù)值映射到[0,1]區(qū)間。消除大單位和小單位的影響(消除量綱)變異大小的差異影響
數(shù)據(jù)的離差標(biāo)準(zhǔn)化
def MinMaxScale(data):
data = (data-data.min())/(data.max()-data.min())
return data
x = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
print('原始數(shù)據(jù)為:\n',x)
x_scaled = MinMaxScale(x)
print('標(biāo)準(zhǔn)化后矩陣為:\n',x_scaled,end = '\n')
?標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化數(shù)據(jù)
標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化又稱零均值標(biāo)準(zhǔn)化或z分?jǐn)?shù)標(biāo)準(zhǔn)化,是當(dāng)前使用最廣泛的數(shù)據(jù)標(biāo)準(zhǔn)化方法。經(jīng)過該方法處理的數(shù)據(jù)均值為0,標(biāo)準(zhǔn)化為1。消除單位影響及自身變量的差異
數(shù)據(jù)的標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化文章來源:http://www.zghlxwxcb.cn/news/detail-848437.html
def StandardScale(data):
data = (data-data.mean())/data.std()
return data
x = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])
print('原始數(shù)據(jù)為:\n',x)
x_scaled = StandardScale(x)
print('標(biāo)準(zhǔn)化后矩陣為:\n',x_scaled,end = '\n')
創(chuàng)作不易 覺得有幫助請(qǐng)點(diǎn)贊關(guān)注收藏~~~文章來源地址http://www.zghlxwxcb.cn/news/detail-848437.html
到了這里,關(guān)于【數(shù)據(jù)挖掘】數(shù)據(jù)清洗、數(shù)據(jù)集成、數(shù)據(jù)標(biāo)準(zhǔn)化的詳解(超詳細(xì) 附源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!