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