數(shù)據(jù)了解
1.數(shù)據(jù)讀取
open(), pd.read_csv(), datasets.load_iris()
注:原始數(shù)據(jù)的行娃磺、列標(biāo)題跌捆;分隔符徽职;其中使用datasets時運用load的話需要所需數(shù)據(jù)本來就存在其中
2.數(shù)據(jù)詳情
df.head(), df.tail(), df.columns, df.info(), df.shape(), df.columns.tolist()
主要在于了解數(shù)據(jù)長什么樣,有哪些字段佩厚,每個字段都是什么類型姆钉,針對不同類型的特征進行不同的數(shù)據(jù)轉(zhuǎn)換,進而得到可以用于建模的特征
4.數(shù)據(jù)標(biāo)注
df1['label'] = 1, df2['label'] = 0
標(biāo)注正負(fù)樣本,便于后期進行數(shù)據(jù)劃分后進行數(shù)據(jù)檢驗
數(shù)據(jù)清洗
1.飽和度統(tǒng)計
df['feature'].drop_duplicates().count()/df.shape(0)
主要在于查看每個特征的缺失情況潮瓶,選擇合適的方法進行數(shù)據(jù)填充陶冷,這里需要搞清楚當(dāng)特征缺失占比達(dá)到百分之多少的時候是不飽和的
2.缺失值處理
define function
針對不同的數(shù)據(jù)類型,通過自定義函數(shù)的方式毯辅,選擇不同的方法進行填充
a. 數(shù)值型
填充方法:0埂伦、均值、中位數(shù)思恐、眾數(shù)沾谜、上下條記錄、插值法壁袄、knn填充
b.布爾型
填充方法:缺失部分直接填充成False
c.有序離散型/連續(xù)型
填充方法:先數(shù)量化类早,再用數(shù)值填充
d.無序離散型
填充方法:轉(zhuǎn)換成布爾型,再用False填充
注:如果缺失值較多(可能70%以上都是缺失的)嗜逻,則可考慮去除特征(前提是通過計算特征重要性后發(fā)現(xiàn)這個特征不重要)或者追究數(shù)據(jù)源
3.異常值處理
import seaborn as sns
sns.boxplot(df[['feature']])
通過繪制每一個特征的箱線圖來判斷對應(yīng)特征的數(shù)據(jù)是否存在異常值
這里同樣的只需要繪制重要特征的箱線圖
首先需要確認(rèn)數(shù)據(jù)是屬于噪聲還是異常值還是離群點涩僻,通常噪聲是測量過程中產(chǎn)生的隨機誤差、異常值一組測定值中與平均值的偏差超過兩倍標(biāo)準(zhǔn)差的測定值栈顷、離群點是一組數(shù)據(jù)中原理一般水平的極大值或極小值
針對噪聲逆日,可不必進行任何處理;針對異常值萄凤,可采用分箱的方式室抽,每廂建立一個模型;離群點可以直接去掉
4.數(shù)據(jù)轉(zhuǎn)換
-
結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化數(shù)據(jù)可以看作關(guān)系型數(shù)據(jù)庫的一張表靡努,包含數(shù)值型和類別兩種基本類型坪圾;每一行數(shù)據(jù)表示一個樣本的信息
可進行啞變量處理、序號編碼(Ordinal Encoding) -
非結(jié)構(gòu)化數(shù)據(jù)
非結(jié)構(gòu)化數(shù)據(jù)主要是文本惑朦、圖像兽泄、音頻和視頻數(shù)據(jù),其包含的信息無法用一個簡單的數(shù)值表示漾月,也沒有清晰的定義病梢,數(shù)據(jù)大小互不相同
可采取one-hot編碼進行處理 -
特征工程中的數(shù)據(jù)類型
數(shù)值型(可直接建模)
枚舉(one-hot)
日期型(day)
無序離散型(比如手機品牌, bool)
有序離散型(比如早中晚, one-hot)
有序連續(xù)型(比如年齡段, on-hot)
針對數(shù)值較大的樣本,可進行相關(guān)函數(shù)轉(zhuǎn)換梁肿,比如:log
5.數(shù)據(jù)失衡
-
特征量級傾斜
擴充數(shù)據(jù)量
重采樣 -
正負(fù)樣本失衡
人工生成數(shù)據(jù)樣本
假設(shè)正樣本10w個蜓陌,負(fù)樣本90w個,則可進行以下兩種方式進行處理過采樣:相當(dāng)于把90w個負(fù)樣本劃分成9組吩蔑,分別和相同的10w個正樣本進行建模钮热,最后綜合9個模型來判斷模型的好壞
欠采樣:相當(dāng)于從90w個負(fù)樣本中隨機抽樣10w個和正樣本建模
**但是無論是過抽樣還是欠抽樣,均可能會產(chǎn)生過擬合的情況烛芬,故在建模過程中需要加上正則化隧期,比如:LR痴奏、RF、XGB
數(shù)據(jù)分析
1.對比分析
sns.distplot(df[['feature']])
a.針對已知的正負(fù)樣本繪制特征的概率密度圖厌秒,查看數(shù)據(jù)分布情況
正常情況而言,主觀上的顯著性特征在正負(fù)樣本上所呈現(xiàn)出來的數(shù)據(jù)規(guī)律是完全相反的擅憔,可以很明顯就區(qū)分兩個樣本
b.正負(fù)樣本聚合觀察
假設(shè)正樣本概率密度圖呈現(xiàn)正態(tài)分布圖樣式鸵闪,負(fù)樣本則呈現(xiàn)相反的正態(tài)分布圖樣式,則把正負(fù)樣本融合之后暑诸,得到的數(shù)據(jù)圖會不會比較平緩蚌讼?
雖然后期同樣要進行正負(fù)樣本合并,便于劃分?jǐn)?shù)據(jù)集个榕,但是這里相當(dāng)于要每個特征繪制三個概率密度圖篡石,后期會得到什么結(jié)論?對后期特征處理會有什么正向影響西采?
2.描述性統(tǒng)計分析
df.describe()
會得到每個特征對應(yīng)的常見統(tǒng)計值
3.相關(guān)性分析(?相當(dāng)于多重共線性)
sns.heatmap()
sns.pairplot()
繪制特征間的相關(guān)系數(shù)熱力圖凰萨,但是對于特征少的情況更適合畫圖,特征多的話可以直接計算相關(guān)系數(shù)矩陣
特征之間有強關(guān)系的話械馆,需要剔除么胖眷?
特征變換
1.特征降維
-
connection
正常情況下針對特征很多的情況,會選擇使用PCA霹崎、LPA等方法選擇能解釋更多信息的特征來代替其他特征珊搀,但是這樣的效率會比較慢,同時也會導(dǎo)致數(shù)據(jù)信息丟失尾菇,所以考慮多個特征結(jié)合的方式進行降維
-
derivative
由于多個特征聚合在一起境析,便會產(chǎn)生新的衍生特征,比如手機型號派诬、價格等可統(tǒng)一成一個phone_info特征
2.onehot編碼
from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False, categories = 'auto')
one_hot_feas = pd.DataFrame(one_hot_encoder.fit_transform(data))
原因:
通常情況下計算特征之間相似性劳淆,需要計算彼此間的距離,如果非數(shù)值型不好計算千埃,所以需要進行onehotencoder編碼憔儿;如果本來就是離散型數(shù)值型變量,則直接計算彼此之間的距離就好了放可,或者直接進行歸一化處理
原理:
分類變量作為二進制向量的表示谒臼,首先將分類值映射到整數(shù)值,然后每個整數(shù)值表示為二進制向量
應(yīng)用:
離散無序的分類特征耀里,通常用于xgb蜈缤、gbdt;用在lr里面效果不好冯挎,因為lr要求特征之間相互獨立底哥;如果需要onehot的特征較多會造成非奇異矩陣的解不唯一
注意:需要在切分?jǐn)?shù)據(jù)之后
3.特征挑選
- 基模型
現(xiàn)根據(jù)數(shù)據(jù)展現(xiàn)出來的特性選擇合適的模型、利用默認(rèn)參數(shù)建立一個基模型,需要計算對應(yīng)的score
- 計算特征重要性
這個是在建立基模型之后么趾徽?這里可以挑選出優(yōu)質(zhì)的特征续滋,然后再進行建模?
數(shù)據(jù)建模
1.數(shù)據(jù)劃分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df, label, test_size=0.3, random_state=number)
使用訓(xùn)練集訓(xùn)練基模型和優(yōu)化模型孵奶,在只有訓(xùn)練集和測試集的情況下疲酌,比例為7:3,在還有驗證集的情況下了袁,比例為6:2:2
參數(shù)解釋:random_state為任意整數(shù)時朗恳,每次進行建模的數(shù)據(jù)都是一樣的,random_state為0時载绿,每次進行建模的數(shù)據(jù)都不一樣
2.模型選擇
-
確定模型
根據(jù)基模型的效果粥诫、數(shù)據(jù)量、特征個數(shù)崭庸、數(shù)據(jù)質(zhì)量選擇合適的模型
a.二分類
LR:可解決多重共線性問題怀浆、計算量小
不適合高維度數(shù)據(jù)、易欠擬合冀自、非線性特征需要進行線性變換
b.多分類
KNN(x):可用于非線性分類揉稚、準(zhǔn)確度高
?不適用于樣本不平衡問題、計算量大
DT/RF(x):適合處理有缺失數(shù)據(jù)的樣本熬粗、運行速度快
易產(chǎn)生過擬合
SVM(x):適用于小樣本搀玖、可解決高維度樣本
很難處理非線性問題、對缺失值敏感驻呐、核函數(shù)(線性核灌诅、多項式核、RBF以及sigmoid核)難選擇
XGB:精度高含末、計算過程中考慮了正則項猜拾、可進行缺失值處理
GBDT: 模型調(diào)用
sklearn.svm.SVC #需要加上核函數(shù)kernel='linear'/('poly', degree=3)
sklearn.LogisticRegression
sklearn.neighbors.KNeighborsClassifier
sklearn.Linear_model.LinearRegression
sklearn.cluster.KMeans(n_clusters=3)
sklearn.decomposition.PCA()
3.參數(shù)調(diào)整
-
GridSearchCV()
網(wǎng)格搜索和交叉驗證
網(wǎng)格搜索:搜索的是參數(shù),即在指定的參數(shù)范圍內(nèi)佣盒,按步長依次調(diào)整參數(shù)挎袜,利用調(diào)整的參數(shù)訓(xùn)練學(xué)習(xí)器,從所有的參數(shù)中找到在驗證集上精度最高的參數(shù)肥惭,這其實是一個循環(huán)和比較的過程
GridSearchCV可以保證在指定的參數(shù)范圍內(nèi)找到精度最高的參數(shù)盯仪,但是這也是網(wǎng)格搜索的缺陷所在,它要求遍歷所有可能參數(shù)的組合蜜葱,在面對大數(shù)據(jù)集和多參數(shù)的情況下全景,非常耗時 -
RandomizedSearchCV()
RandomizedSearchCV的使用方法其實是和GridSearchCV一致的,但它以隨機在參數(shù)空間中采樣的方式代替了GridSearchCV對于參數(shù)的網(wǎng)格搜索牵囤,在對于有連續(xù)變量的參數(shù)時爸黄,RandomizedSearchCV會將其當(dāng)作一個分布進行采樣這是網(wǎng)格搜索做不到的滞伟,它的搜索能力取決于設(shè)定的n_iter參數(shù)
參數(shù)說明:
clf:學(xué)習(xí)器,比如:clf = svm.SVC(kernel = 'linear')
param_dist:參數(shù)搜索范圍
param_dist = {
'n_estimators':range(80,200,4),
'max_depth':range(2,15,1),
'learning_rate':np.linspace(0.01,2,20),
'subsample':np.linspace(0.7,0.9,20),
'colsample_bytree':np.linspace(0.5,0.98,10),
'min_child_weight':range(1,9,1)
}
scoring:精度評價方式
n_tier:訓(xùn)練次數(shù)(數(shù)值越大炕贵,獲得的參數(shù)精度越大梆奈,但是搜索時間越長)
n_jobs:cpu選擇,通常默認(rèn)為1称开,表示使用1個cpu
grid = RandomizedSearchCV(clf, param_dist, cv = 3, scoring = 'neg_log_loss', n_iter=300, n_jobs = -1)
grid.fit(x_train, y_train)
best_estimator = grid.best_estimator_ # 返回最優(yōu)的訓(xùn)練器
print(grid.best_estimator) # 輸出最優(yōu)訓(xùn)練器的精度
print(grid.best_scores_)
模型檢驗
混淆矩陣
相關(guān)鉴裹,正類 | 無關(guān),負(fù)類 | |
---|---|---|
被檢索到 | TP | FP |
無關(guān)钥弯,負(fù)類 | FN | TN |
- 偽正類率(False positive rate,F(xiàn)PR督禽,F(xiàn)PR=FP/(FP+TN)):預(yù)測為正但實際為負(fù)的樣本占所有負(fù)例樣本的比例脆霎;
- 真正類率(True positive rate,TPR狈惫,TPR=TP/(TP+FN)):預(yù)測為正且實際為正的樣本占所有正例樣本的比例睛蛛。
1.accuracy
- 準(zhǔn)確率
metrics.accuracy_score()
預(yù)測正確的占比
accuracy = (TP + TN) / (TP +FP + FN + TN)
2.precision
- 精確率
precision_score()
實際為正占預(yù)測為正的占比
precision = TP / (TP + FP)
3.recall
- 召回率
recall_score()
正確預(yù)測為正占實際為正的占比
recall = TP / (TP + FN)
4.f1-score
- H-mean值
f1_score()
算數(shù)平均數(shù)除以幾何平均數(shù)
f1 = 2TP / (2TP + FP + FN)
5.AUC-ROC
-
ROC曲線
接收者操作特征曲線,是反映敏感性和特異性連續(xù)變量的綜合指標(biāo)胧谈,ROC曲線上每個點反映著對同一信號刺激的感受性
橫軸:FPR
縱軸:TPR
真正的理想情況忆肾,TPR應(yīng)接近1,F(xiàn)PR接近0菱肖,ROC曲線越靠攏(0,1)點客冈,越偏離45度對角線越好 -
AUC
ROC曲線下的面積,顯然這個面積的數(shù)值不會大于1稳强。又由于ROC曲線一般都處于y=x這條直線的上方场仲,所以AUC的取值范圍一般在0.5和1之間
模型優(yōu)化
- 基于基模型的檢驗指標(biāo),找到影響過擬合/欠擬合的原因退疫,更新模型/參數(shù)渠缕,得到優(yōu)化后的模型
- 調(diào)整參數(shù)【迭代次數(shù)30/50/80,學(xué)習(xí)率0.2褒繁,深度3/5/8】