一行代码encoder编码/内存优化/模型调用保存

文章介绍了如何处理样本不平衡问题,包括欠采样(去除负样本)和过采样(增加正样本)两种策略,使用了RandomUnderSampler和SMOTE算法。同时,文章涵盖了编码转换、内存优化技巧以及模型的保存和加载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欠采样:去除负样本

1.编码

from sklearn.preprocessing import LabelEncoder
series_stack = df.stack().astype(str)
label_encoder = LabelEncoder()
df = pd.Series(
                label_encoder.fit_transform(series_stack)
                ,index = series_stack.index)
                ).unstack()

2.源文件与输出结果合并

ypreds = clf.predict_proba(df)
ypreds = pd.DataFrame(ypreds)

df2 = pd.merge(ypreds,data,left_index=True,right_index=True)

#输出csv
df2.to_csv(r"地址.csv",index=False)

3.大文件优化内存



# 解释内存
def reduce_mem(df):
    """对于数值类型的数据进行内存节省"""
    
    starttime = time.time()
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024**2  # 统计内存使用情况
    
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if pd.isnull(c_min) or pd.isnull(c_max):
                continue
            if str(col_type)[:3] == 'int':
                # 装换数据类型
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
                    
    end_mem = df.memory_usage().sum() / 1024**2
    print('-- Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction),time spend:{:2.2f} min'.format(end_mem,
                                                                                                           100*(start_mem-end_mem)/start_mem,
                                                                                                           (time.time()-starttime)/60))
    return df

4.保存调用模型

import pickle
import joblib

#保存模型
joblib.dump(model,r'地址.pkl')

#调用模型
model = joblib.load(r''.pkl)

5.样本不平衡的处理

过采样:增加正样本,使得正负样本接近

import pandas as pd
from collections import Counter
from imblearn.over_sampling import RandomOverSampler, SMOTE  # 随机采样函数 和SMOTE过采样函数

data = pd.read_csv('数据.csv')
print(data.info())

# 分别获取特征值和标签值
X = data.drop(columns='FLAG')
y = data['FLAG']

# 对标签中的变量进行计数统计
print('原始标签数据统计:', Counter(y))

# 随机过采样方法
ros = RandomOverSampler(random_state=0)  # random_state为0(此数字没有特殊含义,可以换成其他数字)使得每次代码运行的结果保持一致
X_oversampled, y_oversampled = ros.fit_resample(X, y)  # 使用原始数据的特征变量和目标变量生成过采样数据集

print('随机过采样处理后', Counter(y_oversampled))
print(X_oversampled.info()) #随机采样后的特征数据信息


# SMOTE法过采样
smote = SMOTE(random_state=0)  # random_state为0(此数字没有特殊含义,可以换成其他数字)使得每次代码运行的结果保持一致
X_smotesampled, y_smotesampled = smote.fit_resample(X, y)  # 使用原始数据的特征变量和目标变量生成过采样数据集
 print('Smote法过采样后', Counter(y_smotesampled))


 欠采样:去除负样本

import pandas as pd
from collections import Counter
from imblearn.over_sampling import RandomUnderSampler, SMOTE  # 随机欠采样函数

data = pd.read_csv('数据.csv')
print(data.info())

# 分别获取特征值和标签值
X = data.drop(columns='FLAG')
y = data['FLAG']

rus = RandomUnderSampler(random_state=0)# random_state为0(此数字没有特殊含义,可以换成其他数字),使得每次代码运行的结果保持一致
X_undersampled, y_undersampled = rus.fit_resample(X,y) # 使用原始数据的特征变量和目标变量生成欠采样数据集
print(Counter(y_undersampled))
print(X_undersampled.shape)

6.模型流程总结:

(1)前置代码:

忽略警告:

import warnings
warnings.filterwarnings('ignore')

(2)缺失值比例统计

def missing_percent(df):
    nan_percent = df.isnull.sum()/len(df)
    nan_percent = nan_percent[nan_percent>0].sort_values()
    return nan_percent
print(missing_percent(df))

(3)查看某一列与其他列的相关系数

df.corr()['列名'].sort_values(ascending=False)

(4)保留nan值编码

df = df.apply(lambda series: pd.Series(                                                          
              LabelEncoder().fit_transform(series[series.notnull()]
                                      ),
             index=series[series.notnull()].index)
             )


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值