模型評估與改進(四) 樣本不均衡

2021-10-07 08:16:59 字數 3455 閱讀 9079

一、什麼是樣本不均衡?

回答:在有監督分類演算法中,標籤的類別比重差異大。

二、如何從取樣角度糾正樣本不均衡?

回答:1、上取樣(over-sampling):通過增加分類中少數類樣本的數量來實現樣本均衡。比較好的方法有smote演算法,通過插值的方式加入近鄰的資料點。

2、下取樣(under-sampling):通過減少分類中多數類樣本的數量來實現樣本均衡。這個方法可能導致資訊缺失,為克服這一缺點,randomundersampler丟掉更多類別邊界部分的資料。

from imblearn.over_sampling import smote #類,上取樣

from imblearn.under_sampling import randomundersampler #類,下取樣

三、分類演算法中哪些超引數可以調和樣本不均衡?回答:機器學習演算法中以下4個演算法有超引數class_weight用來調和樣本不均衡問題。

四、樣本不均衡情況下的評估指標?

五、如何通過閾值調優來提高少數類的**?

def

find_bestmetrics

(y_true,y_predp)

:'''

函式功能:生成不同決策閾值下的presicion、recall、f1的df表,以及最優的正例決策閾值

引數說明:

y_true:series格式,真實y值

y_predp:array格式,演算法模型給出的樣本**為1的概率

返回:resultdf:不同決策閾值下的presicion、recall、f1的**

best_p:最佳f1下的決策閾值p

'''#第一步:構造以真實標籤、**為1概率的df資料集

columns=

['y_true'

,'proba1'

] data=np.concatenate(

(y_true.values,y_predp[:,

1].reshape(y_true.shape[0]

,1))

,axis=1)

df=pd.dataframe(data,columns=columns)

df=df.sort_values(by=

'proba1'

,ascending=

false

) df.index=

range

(df.shape[0]

)#索引重置

df['cum_count'

]=pd.series(

range(1

,df.shape[0]

+1))

#輔助列

y_0_count=df[

'y_true'

].value_counts()[

0]#負例樣本數量

y_1_count=df[

'y_true'

].value_counts()[

1]#正例樣本數量

#第二步:重新計算在不同決策閾值下的presicion、recall、f1

df['cum_count_1'

]=df[

'y_true'

].cumsum(

) df[

'presicion'

]=df[

'cum_count_1'

]/df[

'cum_count'

] df[

'recall'

]=df[

'cum_count_1'

]/y_1_count

df['f1']=

(2*df[

'presicion'

]*df[

'recall'])

/(df[

'recall'

]+df[

'presicion'])

#第三步:最佳f1下的決策閾值p

best_p=df.iloc[np.argmax(df[

'f1'])

,1]

resultdf=df.drop(

['cum_count'

,'cum_count_1'

],axis=1)

return resultdf,best_p

def

metrics_report

(p,y_true,y_predp)

:'''

函式功能:返回正例決策閾值p下的presicion、recall、f1

引數說明:

p:決策閾值

y_true:真實y標籤

y_predp:演算法模型給出的樣本**為1的概率

'''metrics_df,ptt=find_bestmetrics(y_true,y_predp)

#只有ytt_df有用

presicion=metrics_df[metrics_df[

'proba1'

]>=p]

['presicion'

].iloc[-1

] recall=metrics_df[metrics_df[

'proba1'

]>=p]

['recall'

].iloc[-1

] f1=metrics_df[metrics_df[

'proba1'

]>=p]

['f1'

].iloc[-1

]print

('presicion is:\t%0.2f'

%presicion)

print

('recall is:\t%0.2f'

%recall)

print

('f1 is:\t\t%0.2f'

%f1)

return presicion,recall,f1

def

label_predict

(p,y_predp)

:'''

函式功能:返回標籤**

引數說明:

p:決策閾值

y_predp:演算法模型給出的樣本**為1的概率

'''label_pred=y_predp[:,

1].copy(

) label_pred[y_predp[:,

1]>=p]=1

label_pred[y_predp[:,

1]return label_pred

模型評估與改進

k折交叉驗證 將資料分成k部分,每部分叫做折。在訓練時,乙個折作為測試集,其餘折作為訓練集。優點 缺點 劃分資料,使得每個折中類別之間的比例與整個資料集中的比例相同 分層k折交叉驗證比k折交叉驗證有更好的泛化效能 每個折只包含單個樣本的k折交叉驗證,單個資料點作為測試集 訓練集取train size...

模型評估與模型選擇

模型選擇的目的是使學到的模型對已知資料和未知資料都有較好的 能力,同時又要避免過擬合。所考察的指標主要是模型的訓練誤差及測試誤差,模型的複雜度越高,訓練誤差越小,但測試誤差先減小後增大。訓練誤差和測試誤差隨模型複雜度變化趨勢 過擬合是指模型的複雜度比真模型更高,模型選擇就是選擇測試誤差最小的適當複雜...

模型評估與選擇

錯誤率 分類錯誤的樣本書佔樣本總數的比例 誤差 學習器的實際 輸出與樣本的真實輸出之間的差異 訓練誤差 經驗誤差 學習器在訓練集上的誤差 泛華誤差 在新樣本上的誤差 過擬合 學習器把訓練樣本學的 太好 了,很可能已經把訓練樣本本身的一些特點當作了所有潛在樣本都會具有的一般性質,導致泛華效能下降。欠擬...