生活随笔
收集整理的這篇文章主要介紹了
数据挖掘 —— 数据预处理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)挖掘 —— 數(shù)據(jù)預(yù)處理
- 1. 數(shù)據(jù)清洗
- 2. 特征預(yù)處理
- 3 特征降維
1. 數(shù)據(jù)清洗
數(shù)據(jù)清洗包括數(shù)據(jù)樣本抽樣和異常值(空值)處理
直接丟棄(包括重復(fù)數(shù)據(jù))把是否有異常當(dāng)做一個(gè)新的屬性,替代原值集中指代邊界值指代插值
import pandas
as pd
import numpy
as np
df
= pd
.DataFrame({"A":['a0','a1','a1','a2','a3','a4'],"B":['b0','b1','b2','b2','b3',None
],"C":[1,2,None
,3,4,5],"D":[0.1,10.2,11.4,8.9,9.1,12],"E":[10,19,32,25,8,None
],"F":["f0","f1","g2","f3","f4","f5"]
})
# 識(shí)別異常值和空值
df
.isnull()
df
.dropna()
df
.dropna(how
= "any",subset
= ["B"]) # subset為根據(jù)某個(gè)字段進(jìn)行去除空值# 直接丟棄
df
.duplicated(["A"]) # 當(dāng)
.duplicated給定多個(gè)字段時(shí),只有當(dāng)每個(gè)字段都相同時(shí)才會(huì)返回True
df
.drop_duplicates(["B"])
df
.drop_duplicates(["A"],keep
= False
) # keep有三個(gè)可傳參數(shù) first last False 也有inplace方法# 集中指代
df
.fillna(method
= "ffill",axis
= 0) # 用上方數(shù)據(jù)填充
df
["E"].fillna(df
["E"].mean())# 插值指代
df
["C"].interpolate() # 調(diào)用interpolate時(shí)必須為Series
df
["C"].interpolate(method
= "spline",order
= 3) # interpolate方法還可以指定插值方法,如三次樣條插值# 取上下四分位數(shù)的k倍為邊界值 k一般取
1.5-3
k
= 1.5
upper_q
= df
["D"].quantile(q
= 0.75)
lower_q
= df
["D"].quantile(q
= 0.25)
q_int
= upper_q
- lower_q
df
[df
["D"] > lower_q
- k
*q_int
][df
["D"] < upper_q
+k
*q_int
]# 去除
"F"字段不是以f開(kāi)頭的數(shù)據(jù)
df
.drop([2])
df
[[True
if value
.startswith("f") else False
for value
in list(df
["F"].values
)]]
2. 特征預(yù)處理
反映目的的屬性稱之為標(biāo)注(也叫作標(biāo)記、標(biāo)簽、label)特征預(yù)處理分為四個(gè)部分:
2.1 特征選擇
- 特征選擇:剔除與標(biāo)注不相關(guān)或者冗余的特征
- 其中一種思路為數(shù)據(jù)歸約:包括三種思想
過(guò)濾思想:特征與標(biāo)注的相關(guān)性包裹思想:遍歷特征子集,即構(gòu)造簡(jiǎn)單模型,根據(jù)系數(shù)去掉弱特征嵌入思想:建立簡(jiǎn)單回歸模型
import numpy
as np
import pandas
as pd
import scipy
.stats
as ss
df
= pd
.DataFrame({ "A":ss
.norm
.rvs(size
= 100),"B":ss
.norm
.rvs(size
= 100),"C":ss
.norm
.rvs(size
= 100),"D":ss
.norm
.rvs(size
= 100),"E":np
.random
.randint(low
= 0,high
= 2,size
= 100)
})
X = df
.loc
[:,["A","B","C","D"]]
Y = df
.loc
[:,["E"]]
# 過(guò)濾思想
from sklearn
.feature_selection
import SelectKBest
skb
= SelectKBest(k
= 2)
"""
klearn
.feature_selection
.SelectKBest(score_func
=<function f_classif
>, k
=10)
其中score_func為指定特征選擇函數(shù):默認(rèn)為:f_classif(方差分析
),其他還有chi2(卡方檢驗(yàn)
),mutual_info_classif(互信息
),根據(jù)特征的屬性選擇合適的函數(shù)
k為最大特征選擇數(shù)目
"""
skb
.fit(X,Y)
result
= skb
.transform(X)# 包裹思想
"""
采用
RFE算法(即遞歸特征消除recursive feature elimination
)
"""
from sklearn
.svm
import SVR
"""
svm為支持向量機(jī)
SVR為支持向量回歸
"""
from sklearn
.feature_selection
import RFE
rfe
= RFE(estimator
= SVR(kernel
= "linear"),n_features_to_select
= 2,step
= 1)
"""
estimator:對(duì)特征含有權(quán)重的預(yù)測(cè)模型(例如,線性模型對(duì)應(yīng)參數(shù)coefficients
)
n_features_to_list:最終特征選擇數(shù)目
step:每次消除特征的數(shù)目
"""
rfe
.fit_transform(X,Y)# 嵌入思想
"""
建立簡(jiǎn)單回歸模型現(xiàn)在的模型與最終的模型要有一定的關(guān)聯(lián)。
"""
from sklearn
.tree
import DecisionTreeRegressor
from sklearn
.feature_selection
import SelectFromModel
sfm
= SelectFromModel(estimator
= DecisionTreeRegressor(),threshold
= 0.3) # threshold為權(quán)重的閾值
sfm
.fit_transform(X,Y)
2.2 特征變換
特征變換可分為六種:
對(duì)指化:大于0部分的數(shù)據(jù)若差距較小,經(jīng)過(guò)指數(shù)化可加大尺度離散化數(shù)據(jù)平滑歸一化(標(biāo)準(zhǔn)化)數(shù)值化正規(guī)化
# 對(duì)指化
"""大于
0部分的數(shù)據(jù)若差距較小,經(jīng)過(guò)指數(shù)化可加大尺度
"""
# 指數(shù)化
"""
將較大數(shù)據(jù)縮放到我們?nèi)菀子?jì)算的范圍
如聲音強(qiáng)度和地震強(qiáng)度
"""
# 離散化
"""
將連續(xù)變量分成幾段
原因:
1、克服數(shù)據(jù)缺陷
2、某些算法需要:樸素貝葉斯算法
3、非線數(shù)據(jù)映射
方法:
1、等頻(等深)放大
2、等距(等寬)放大
3、自因變量?jī)?yōu)化
"""
lst
= [56,8,10,15,16,24,25,30,40,67]pd
.qcut(lst
,q
= 3,labels
= ["low","medium","high"])# 等深分箱pd
.cut(lst
,bins
= 3,labels
= ["low","medium","high"])# 等寬分箱# 歸一化
"""
[0,1]
"""
from sklearn
.preprocessing
import MinMaxScaler
data
= np
.array([1,5,9,89,26,56,38]).reshape(-1,1)
to_one
= MinMaxScaler()
to_one
.fit_transform(data
)# 標(biāo)準(zhǔn)化(狹義)
"""
均值為
0,標(biāo)準(zhǔn)差為
1
"""
from sklearn
.preprocessing
import StandardScaler
normal
= StandardScaler()
normal
.fit_transform(data
)# 數(shù)值化
"""
四種數(shù)據(jù)類型:
1、定類:需要數(shù)值化(如:低 中 高)
--獨(dú)熱編碼
2、定序:需要數(shù)值化(如:紅 綠 藍(lán))
--標(biāo)簽編碼
3、定距:需要?dú)w一化
4、定比
數(shù)值化的方式:
1、標(biāo)簽化(label):如
0、
1、
22、獨(dú)熱(one
-hot encode):用稀疏矩陣表示
"""
from sklearn
.preprocessing
import LabelEncoder
data1
= np
.array(["up","down","down","down","up"]).reshape(-1,1)
le
= LabelEncoder()
le
.fit_transform(data1
) # 標(biāo)簽編碼
from sklearn
.preprocessing
import OneHotEncoder
,LabelEncoder
data2
= np
.array(["green","red","yellow","red","green","green"])
ohe
= OneHotEncoder()
"""
獨(dú)熱編碼前需要標(biāo)簽編碼
"""
data_tran
= LabelEncoder().fit_transform(data2
)
ohe_result
= ohe
.fit_transform(data_tran
.reshape(-1,1)) # 返回結(jié)果為壓縮稀疏矩陣
ohe_result
.toarray() # 使用toarray方法轉(zhuǎn)化為數(shù)組
"""
對(duì)于獨(dú)熱編碼 pandas提供了更為簡(jiǎn)易的方法
df
= pd
.get_dummies(df
,columns
= [])
"""
# 正規(guī)化(規(guī)范化)
"""
正規(guī)化一般針對(duì)一條記錄數(shù)據(jù)進(jìn)行
根據(jù)距離度量的次數(shù)不同 一般使用
L1或
L2
"""
data
= np
.array([5,6,8,9,3,4,7,8,15,69]).reshape(1,-1)#
默認(rèn)對(duì)每一行進(jìn)行正規(guī)化(且為二維數(shù)組
)
from sklearn
.preprocessing
import Normalizer
norm1
= Normalizer(norm
= "l1")
norm1
.fit_transform(data
)
norm2
= Normalizer(norm
= "l2")
norm2
.fit_transform(data
)
3 特征降維
PCA 和 LDA 特征降維的區(qū)別于聯(lián)系:
兩者均可以對(duì)數(shù)據(jù)進(jìn)行降維。兩者在降維時(shí)均使用了矩陣特征分解的思想。兩者都假設(shè)數(shù)據(jù)符合高斯分布
LDA是有監(jiān)督的降維方法,而PCA是無(wú)監(jiān)督的降維方法LDA降維最多降到類別數(shù)k-1的維數(shù),而PCA沒(méi)有這個(gè)限制。LDA除了可以用于降維,還可以用于分類。LDA選擇分類性能最好的投影方向,而PCA選擇樣本點(diǎn)投影具有最大方差的方向。這點(diǎn)可以從下圖形象的看出,在某些數(shù)據(jù)分布下LDA比PCA降維較優(yōu)。
import numpy
as np
import pandas
as pd
X = np
.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
Y = np
.array ([1,1,1,2,2,2])
#
PCA 降維
from sklearn
.decomposition
import PCA
pca
= PCA(n_components
= 1)
pca
.fit(X)
pca
.transform(X)
pca
.explained_variance_ratio_ # 它代表降維后的各主成分的方差值占總方差值的比例
,這個(gè)比例越大
,則越是重要的主成分。#
LDA降維
"""sklearn
.decomposition么會(huì)產(chǎn)生不相關(guān)特征引入、過(guò)度擬合等問(wèn)題。我們可以使用
PCA來(lái)降維,但
PCA沒(méi)有將類別標(biāo)簽考慮進(jìn)去,屬于無(wú)監(jiān)督的。
"""
from sklearn
.discriminant_analysis
import LinearDiscriminantAnalysis
lda
= LinearDiscriminantAnalysis(n_components
= 1)
lda
.fit(X,Y)
lda
.transform(X)
lda
.explained_variance_ratio_ # 每一個(gè)維度解釋的方差占比#
LDA還可以用作分類器 即Fisher分類器
lda
.predict([[-1,-3]])
by CyrusMay 2022 04 05
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的数据挖掘 —— 数据预处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。