数据挖掘一般流程及模型整理
https://mp.weixin.qq.com/s/mtU-58ZPW9ruOj7H16zpVQ
?
一.數(shù)據(jù)讀取:
?
1.????csv文件:csv_data= pd.read_csv('/路徑/test.csv')
2.????txt文件:f= open('/路徑/test.txt',?'r')
3.????excel文件:
import xlrd
f=xlrd.open_workbook(r'\路徑\demo.xlsx',formatting_info=True)
table =data.sheet_by_name("Sheet2")
or
df = pd.read_excel("\路徑\window regulator.xlsx",sheetname="Sheet2")
?
二.數(shù)據(jù)處理和清洗:
?
1.????數(shù)據(jù)清洗:
A.調(diào)整數(shù)值及格式,去掉噪聲,不可信值,缺失值較多的字段
1)去掉空格,換行符:
" xyz ".strip() # returns "xyz"
" xyz ".lstrip() # returns "xyz "
" xyz ".rstrip() # returns " xyz"
" x y z ".replace(' ', '') # returns "xyz"
2)用split斷開再合上 ''.join(your_str.split())
3)用正則表達(dá)式來完畢替換: import re strinfo = re.compile('word') b = strinfo.sub('python',a)print b 輸出的結(jié)果也是hello python
4)刪除pandas DataFrame的某一/幾列:
方法一:直接del DF['column-name']
方法二:采用drop方法,有下面三種等價(jià)的表達(dá)式:
i. DF= DF.drop('column_name', 1);
ii. DF.drop('column_name',axis=1,inplace=True)
iii. DF.drop([DF.columns[[0,1, 3]]],axis=1,inplace=True) ?
5)刪除DataFrame某行
DataFrame.drop(labels=None,axis=0,index=None,columns=None, inplace=False)?
在這里默認(rèn):axis=0,指刪除index,因此刪除columns時(shí)要指定axis=1;inplace=False,默認(rèn)該刪除操作不改變原數(shù)據(jù),而是返回一個執(zhí)行刪除操作后的新dataframe;inplace=True,則會直接在原數(shù)據(jù)上進(jìn)行刪除操作,刪除后就回不來了。
6) 數(shù)據(jù)類型轉(zhuǎn)換:
?
B.歸一化處理,離散化處理,數(shù)據(jù)變換(log,0-1,exp,box-cox):
?
1)0-1標(biāo)準(zhǔn)化:這是最簡單也是最容易想到的方法,通過遍歷feature vector里的每一個數(shù)據(jù),將Max和Min的記錄下來,并通過Max-Min作為基數(shù)(即Min=0,Max=1)進(jìn)行數(shù)據(jù)的歸一化處理。
def MaxMinNormalization(x,Max,Min):
x = (x - Min) / (Max - Min);
???? return x;
?
2)Z-score標(biāo)準(zhǔn)化:這種方法給予原始數(shù)據(jù)的均值(mean)和標(biāo)準(zhǔn)差(standard deviation)進(jìn)行數(shù)據(jù)的標(biāo)準(zhǔn)化。經(jīng)過處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布,即均值為0,標(biāo)準(zhǔn)差為1,這里的關(guān)鍵在于復(fù)合標(biāo)準(zhǔn)正態(tài)分布,個人認(rèn)為在一定程度上改變了特征的分布。
def Z_ScoreNormalization(x,mu,sigma):
???? x = (x - mu) / sigma;
???? return x;
?
3)Sigmoid函數(shù):Sigmoid函數(shù)是一個具有S形曲線的函數(shù),是良好的閾值函數(shù),且在(0, 0.5)處中心對稱,在(0, 0.5)附近有比較大的斜率,而當(dāng)數(shù)據(jù)趨向于正無窮和負(fù)無窮的時(shí)候,映射出來的值就會無限趨向于1和0,是個人非常喜歡的“歸一化方法”,之所以打引號是因?yàn)槲矣X得Sigmoid函數(shù)在閾值分割上也有很不錯的表現(xiàn),根據(jù)公式的改變,就可以改變分割閾值,這里作為歸一化方法,我們只考慮(0, 0.5)作為分割閾值的點(diǎn)的情況:
def sigmoid(X,useStatus):
???? if useStatus:
??????????? return 1.0 / (1 +np.exp(-float(X)));
???? else:
??????????? return float(X);
?
4)變換數(shù)據(jù)范圍:除了上述介紹的方法之外,另一種常用的方法是將屬性縮放到一個指定的最大和最小值(通常是1-0)之間,這可以通過preprocessing.MinMaxScaler類實(shí)現(xiàn)。
X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_scaled=X_std/(max-min)+min
?
5)正則化:正則化的過程是將每個樣本縮放到單位范數(shù)(每個樣本的范數(shù)為1),如果后面要使用如二次型(點(diǎn)積)或者其它核方法計(jì)算兩個樣本之間的相似性這個方法會很有用。正則化的主要思想是對每個樣本計(jì)算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù),這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1。
?
?????????????p-范數(shù)的計(jì)算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
?
該方法主要應(yīng)用于文本分類和聚類中。例如,對于兩個TF-IDF向量的l2-norm進(jìn)行點(diǎn)積,就可以得到這兩個向量的余弦相似性。可以使用preprocessing.normalize()函數(shù)對指定數(shù)據(jù)進(jìn)行轉(zhuǎn)換,用processing.Normalizer()類實(shí)現(xiàn)對訓(xùn)練集和測試集的擬合和轉(zhuǎn)換。
?
6)Box-cox變換(stats.boxcox):Box-Cox變換是Box和Cox在1964年提出的一種廣義冪變換方法,是統(tǒng)計(jì)建模中常用的一種數(shù)據(jù)變換,用于連續(xù)的響應(yīng)變量不滿足正態(tài)分布的情況。Box-Cox變換之后,可以一定程度上減小不可觀測的誤差和預(yù)測變量的相關(guān)性。Box-Cox變換的主要特點(diǎn)是引入一個參數(shù),通過數(shù)據(jù)本身估計(jì)該參數(shù)進(jìn)而確定應(yīng)采取的數(shù)據(jù)變換形式,Box-Cox變換可以明顯地改善數(shù)據(jù)的正態(tài)性、對稱性和方差相等性,對許多實(shí)際數(shù)據(jù)都是行之有效的。
?
2.????數(shù)據(jù)采樣:
?
A.無放回的抽樣?
使用 random.sample
import random
idxTest = random.sample(range(nPoints),nSample)??????
#得到的idxTest 是一個list形式
?
B.有放回的抽樣?
使用 random.choice (一次選一個)
BagSamples=50
for i in range(nBagSamples):
? ? idxBag.append(np.random.choice(range(len(xTrain))))
#choice直接選出的不是list
?
更多方法詳見pandas.DataFrame.resample
?
三.特征工程:
1.????特征處理:數(shù)值型,類別型,時(shí)間型,文本型,統(tǒng)計(jì)型,組合特征,特征衍生,如:
1) 定量特征二值化
2) 定性特征啞變量化
3)單一變量的基礎(chǔ)轉(zhuǎn)換,比如通過對單一變量進(jìn)行平方,開根號,log轉(zhuǎn)換等。
4)變量通過添加時(shí)間維度進(jìn)行衍生,比如3個月交易數(shù)據(jù),6個月交易數(shù)據(jù)等5)多變量的運(yùn)算,比如兩個變量相加,相乘或變量間計(jì)算一個比率后得到新變量。
6) 多個變量進(jìn)行PCA,LDA降維化。
?
Python sklearn類總結(jié):
?
?
2.????特征選擇:當(dāng)數(shù)據(jù)預(yù)處理完成后,我們需要選擇有意義的特征輸入機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練。首先基于業(yè)務(wù)理解,選擇對因變量有明顯影響的特征,要評估特征的獲取難度,覆蓋率,準(zhǔn)確率。然后基于數(shù)據(jù)層面進(jìn)行特征選擇,通常來說,從兩個方面考慮來選擇特征:
-
特征是否發(fā)散:如果一個特征不發(fā)散,例如方差接近于0,也就是說樣本在這個特征上基本上沒有差異,這個特征對于樣本的區(qū)分并沒有什么用。
-
特征與目標(biāo)的相關(guān)性:這點(diǎn)比較顯見,與目標(biāo)相關(guān)性高的特征,應(yīng)當(dāng)優(yōu)選選擇。除移除低方差法外,本文介紹的其他方法均從相關(guān)性考慮。
特征選擇主要有兩個目的:一是減少特征數(shù)量、降維,使模型泛化能力更強(qiáng),減少過擬合;二是增強(qiáng)對特征和特征值之間的理解。
根據(jù)特征選擇的形式又可以將特征選擇方法分為3種:
?
A.過濾型:按照發(fā)散性或者相關(guān)性對各個特征進(jìn)行評分,設(shè)定閾值或者待選擇閾值的個數(shù),選擇特征。sklearn.feature_selection.SelectKBest
?
1)方差選擇法
使用方差選擇法,先要計(jì)算各個特征的方差,然后根據(jù)閾值,選擇方差大于閾值的特征。使用feature_selection庫的VarianceThreshold類來選擇特征。
2)相關(guān)系數(shù)法
使用相關(guān)系數(shù)法,先要計(jì)算各個特征對目標(biāo)值的相關(guān)系數(shù)以及相關(guān)系數(shù)的P值。用feature_selection庫的SelectKBest類結(jié)合相關(guān)系數(shù)來選擇特征。
3)卡方檢驗(yàn)
經(jīng)典的卡方檢驗(yàn)是檢驗(yàn)定性自變量對定性因變量的相關(guān)性。假設(shè)自變量有N種取值,因變量有M種取值,考慮自變量等于i且因變量等于j的樣本頻數(shù)的觀察值與期望的差距,構(gòu)建統(tǒng)計(jì)量:
這個統(tǒng)計(jì)量的含義簡而言之就是自變量對因變量的相關(guān)性。用feature_selection庫的SelectKBest類結(jié)合卡方檢驗(yàn)來選擇特征。
4)互信息法
經(jīng)典的互信息也是評價(jià)定性自變量對定性因變量的相關(guān)性的,互信息計(jì)算公式如下:
為了處理定量數(shù)據(jù),最大信息系數(shù)法被提出,使用feature_selection庫的SelectKBest類結(jié)合最大信息系數(shù)法來選擇特征。?
?
B.包裹型:根據(jù)目標(biāo)函數(shù)(通常是預(yù)測效果評分),每次選擇若干特征,或者排除若干特征。遞歸特征消除法:遞歸消除特征法使用一個基模型來進(jìn)行多輪訓(xùn)練,每輪訓(xùn)練后,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進(jìn)行下一輪訓(xùn)練。使用feature_selection庫的RFE類來選擇特征。
?
C.嵌入型:先使用某些機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練,得到各個特征的權(quán)值系數(shù),根據(jù)系數(shù)從大到小選擇特征。類似于過濾法,但是是通過訓(xùn)練來確定特征的優(yōu)劣。
?
1)基于懲罰項(xiàng)的特征選擇法
使用帶懲罰項(xiàng)的基模型,除了篩選出特征外,同時(shí)也進(jìn)行了降維。使用feature_selection庫的SelectFromModel類結(jié)合帶L1懲罰項(xiàng)的邏輯回歸模型。
2)基于樹模型的特征選擇法
樹模型中GBDT也可用來作為基模型進(jìn)行特征選擇,使用feature_selection庫的SelectFromModel類結(jié)合GBDT模型。
?
3.????特征有效性分析:特征權(quán)重分析,監(jiān)督特征的有效性,防止特征質(zhì)量下降,影響模型性能。
?
四. 模型選擇
總結(jié)
以上是生活随笔為你收集整理的数据挖掘一般流程及模型整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 霍夫变换原理说明
- 下一篇: 煤柱群下重复开采覆岩与地表移动变形数值模