文章目录
- 基础包导入
- 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)