欠采样:去除负样本
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)
)