文章目录

  • 基础包导入
  • csv文件操作
  • 显示所有行列
  • 查看基本情况
  • 查看缺失值
  • 缺失值填补
  • 查看特征分布
  • loc和iloc的用法
  • 对两个不同的列表取差值
  • 尝试语句
  • 准确率、精准率、召回率、F1值
  • sklearn导包
  • SimpleImputer填补缺失值
  • 特征编码
  • 普通随机划分训练集测试集
  • k折交叉验证划分训练集测试集
  • 解决画图中文乱码问题
  • 用shap图显示特征分布取值
  • 简单使用catboost
  • 样本分布不均衡时适用的SMOTE算法


基础包导入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

csv文件操作

#读入csv文件
data=pd.read_csv('自己的路径加文件名.csv',encoding='GBK')
#保存csv文件
data.to_csv('自己的路径加文件名.csv',index=0)

显示所有行列

pd.set_option('display.width',None)
pd.set_option('display.max_columns',None)
# 显示所有列
pd.set_option('display.max_rows',None)
# 设置数据的显示长度,默认为50
pd.set_option('max_colwidth',200)
# 禁止自动换行(设置为Flase不自动换行,True反之)
pd.set_option('expand_frame_repr', False)

查看基本情况

print(data.info()) #查看大概情况
print(data.describe())#计数,平均值,标准差,最小值,最大值以及较低的百分位数和50
data.head() #默认查看前5位,括号内输入数字指定查看前几位

查看缺失值

#缺失值分析
def missing_values(df):
    alldata_na=pd.DataFrame(df.isnull().sum(),columns={'missingNum'})
    alldata_na['existNum']=len(df)-alldata_na['missingNum']
    alldata_na['sum']=len(df)
    alldata_na['missingRatio']=alldata_na['missingNum']/len(df)*100
    alldata_na['dtype']=df.dtypes
    #ascending:默认True升序排列;False降序排列
    alldata_na = alldata_na[alldata_na['missingNum']>0].reset_index().sort_values(by=['missingNum','index'],ascending=[False,True])
    alldata_na.set_index('index',inplace=True)
    return alldata_na

alldata_na=missing_values(data) #data是自己的dataframe文件
#列出缺失率大于50%的列
na_cols=[col for col in alldata_na.index[alldata_na['missingRatio']>50]]

缺失值填补

#缺失值填0
alldata.fillna(0,inplace=True)

查看特征分布

cols=[col for col in data.columns]
for feature in cols:
    print("hm_data_year1:"+feature + "的特征分布如下:")
    print(data[feature].value_counts())
    print()

loc和iloc的用法

loc是指location的意思,iloc中的i是指integer。
loc是根据index来索引,比如下边的df定义了一个index,那么loc就根据这个index来索引对应的行。iloc并不是根据index来索引,而是根据行号来索引,行号从0开始,逐次加1。

In [1]: df = DataFrame(randn(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

对两个不同的列表取差值

#取去掉list1和list2共有的,list1独有的值
list3=list(set(list1).difference(set(list2)))

尝试语句

#如果执行try语句出错则pass
try:
    xxx
except:
    pass

准确率、精准率、召回率、F1值

准确率(Accuracy)就是所有的预测正确(正类负类)的占总的比重。
精确率(Precision),查准率。即正确预测为正的占全部预测为正的比例。真正正确的占所有预测为正的比例。
召回率(Recall),查全率。即正确预测为正的占全部实际为正的比例。真正正确的占所有实际为正的比例。
F1值(H-mean值)。F1值为算数平均数除以几何平均数,且越大越好,将Precision和Recall的上述公式带入会发现,当F1值小时,True Positive相对增加,而false相对减少,即Precision和Recall都相对增加,即F1对Precision和Recall都进行了加权。

from sklearn import metrics

acc= metrics.accuracy_score(ey_val,out_of_fold)
pr=metrics.precision_score(ey_val,out_of_fold)
re=metrics.recall_score(ey_val,out_of_fold)
f1=metrics.f1_score(ey_val,out_of_fold)

sklearn导包

from sklearn.impute import SimpleImputer
from sklearn.model_selection import KFold,train_test_split
from sklearn.preprocessing import LabelEncoder,MinMaxScaler

SimpleImputer填补缺失值

特征编码

encoder = LabelEncoder()
data['XXX'] = encoder.fit_transform(data['XXX'])

普通随机划分训练集测试集

x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

k折交叉验证划分训练集测试集

from sklearn.model_selection import KFold
kf = KFold(5, True, 10)

X, Y = loda_data('./data.txt')
for train_index, test_index in kf.split(X):
    print('训练集:{}'.format(train_index)
    print('测试集:{}'.format(test_index)

解决画图中文乱码问题

#解决画图中文乱码问题
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']

用shap图显示特征分布取值

import shap
explainer = shap.TreeExplainer(model) #model是训练好的模型
shap_values = explainer.shap_values(x_train)
#颜色代表特征取值的大小,宽度代表特征分布。若shap value小于零,则对因变量产生负影响;若shap value大于零,则对因变量产生正影响。
shap.summary_plot(shap_values[1], x_train,max_display=40)
shap.force_plot(explainer.expected_value, shap_values[1,:], X_train.iloc[1,:]) #单条可视化
shap.dependence_plot("SMART_SCORE", shap_values, X_train)

简单使用catboost

from catboost import CatBoostClassifier
X_train, X_validation, y_train, y_validation = train_test_split(X,y,test_size=0.3 , random_state=1234)
model = CatBoostClassifier(iterations=100, depth=5,learning_rate=0.5, loss_function='CrossEntropy',
                            logging_level='Verbose')
model.fit(X_train,y_train,eval_set=(X_validation, y_validation),plot=True)#plot打开可视化
#显示特征分布取值
fea_ = model.feature_importances_
fea_name = model.feature_names_
plt.figure(figsize=(20, 80))
plt.barh(fea_name,fea_,height =0.5)
#取特征值大于0.05的列
select_columns=[f for f, s in zip(data.columns, model.feature_importances_) if abs(s)> 0.05 ]

样本分布不均衡时适用的SMOTE算法

from collections import Counter
# 查看所生成的样本类别分布,是否属于类别不平衡数据
print(Counter(y))
#这个是1:1构造
# 使用imlbearn库中上采样方法中的SMOTE接口
from imblearn.over_sampling import SMOTE
# 定义SMOTE模型,random_state相当于随机数种子的作用
smo = SMOTE(random_state=42)
X_smo, y_smo = smo.fit_sample(X, y)