如何处理建模样本数据不平衡问题

当数据不平衡的时,比如样本标签1有10000个数据,样本标签0有100个数据,这时如果采用下采样会浪费很多样本,所以引入过采样。

过采样是根据样本标签少的样本的规律去生成更多该标签样本,这样使得数据趋向于平衡。

典型的过采样方式是SMOTE等。

以下使用的数据可从这里下载,提取码ggr8。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from imblearn.over_sampling import SMOTE
 
def load_and_analyse_data():
    data = pd.read_csv('./data/creditcard.csv')
    # ----------------------预处理---------------------------------------------
 
    # ----------------------标准化Amount列---------
    data['normAmout'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1))
    data = data.drop(['Time', 'Amount'], axis=1)
    # ----------------------------------------------
 
    X = data.ix[:, data.columns != 'Class']
    y = data.ix[:, data.columns == 'Class']
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
    # ----------------------采样-------------------
    sample_solver = SMOTE(random_state=0)
    X_sample ,y_sample = sample_solver.fit_sample(X_train,y_train)#从原始的训练集采出样本,用来训练模型
    return np.array(X_test),np.array(y_test).reshape(len(y_test)),np.array(X_sample),np.array(y_sample).reshape(len(y_sample))
 
if __name__ == '__main__':
    X_test, y_test, X_sample, y_sample  = load_and_analyse_data()
    X_train,X_dev,y_train,y_dev = train_test_split(X_sample,y_sample,test_size=0.3,random_state=1)
 
    print("X_train:{}  X_dev:{}  X_test:{}".format(len(y_train), len(y_dev), len(y_test)))
    model = LogisticRegression()
    parameters = {'C':[0.001,0.003,0.01,0.03,0.1,0.3,1,3,10]}
    gs  = GridSearchCV(model,parameters,verbose=5,cv=5)
    gs.fit(X_train,y_train)#训练模型,训练集为采样后的数据
    print('最佳模型:',gs.best_params_,gs.best_score_)
    print('在采样数据上的性能表现:')
    print(gs.score(X_dev,y_dev))
    y_dev_pre = gs.predict(X_dev)
    print(classification_report(y_dev,y_dev_pre))
    print('在原始数据上的性能表现:')
    print(gs.score(X_test,y_test))
    y_pre = gs.predict(X_test)
    print(classification_report(y_test,y_pre))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值