一周算法实践进阶day1:数据预处理

数据说明

本次数据与之前数据不同: 下载
这份数据集是金融数据(非原始数据,已经处理过了),我们要做的是预测贷款用户是否会逾期。表格中 “status” 是结果标签:0表示未逾期,1表示逾期。

1任务

  • 数据类型转换和缺失值处理(尝试不同的填充看效果)以及及其他你能借鉴的数据探索。

2完整代码及注释

#导入包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn import tree

#加载数据
# data = pd.read_csv('data.csv',encoding='gbk')
data = pd.read_csv('data.csv',encoding='unicode_escape')#编码格式要注意
print("数据行列数",data.shape)

#数据分析
#pd.set_option('display.max_columns', None)#显示所有的列
#print(data)
print(data.head())#表头
print(data.describe())#基本统计量

#划分不同数据类型
"""
划分不同数据类型:数值型、非数值型、标签
使用:Pandas对象有 select_dtypes() 方法可以筛选出特定数据类型的特征
参数:include 包括(默认);exclude 不包括
"""
#划分数据集
X = data.drop(['status'],axis=1)
X_num = X.select_dtypes(include='number').copy()#数值型
X_str = X.select_dtypes(exclude='number').copy()#非数值型
y = data['status']

#缺失值处理
#发现缺失值方法:缺失个数、缺失率
#查看每列是否有缺失值
print(data.isnull().sum())
# 使用缺失率(可以了解比重)并按照值降序排序 ascending=False
X_num_miss = (X_num.isnull().sum() / len(X_num)).sort_values(ascending=False)
print(X_num_miss.head())
print('----------' * 5)
X_str_miss = (X_str.isnull().sum() / len(X_str)).sort_values(ascending=False)
print(X_str_miss.head())
#缺失值较多的列student_feature进行删除
X_num = X_num.drop(['student_feature'],axis = 1)
#高缺失率特征处理:EM插补、多重插补。这里先将缺失值归为一类。可以用平均数、中位数、众数、固定值(比如0)填充
# 用0填充
X_num.fillna(0,inplace = True)#fillna()会填充nan数据,返回填充后的结果。如果希望在原数据集中修改,则把inplace设置为True
X_str.fillna(0,inplace = True)
## 用众数填充
# X_num.fillna(X_num.mode().iloc[0, :], inplace=True)
# X_str.fillna(X_str.mode().iloc[0, :], inplace=True)

#离散特征编码
"""
序号编码:用于有大小关系的数据
one-hot编码:用于无序关系的数据
"""
X_str_oh = pd.get_dummies(X_str['reg_preference_for_trad'])#对房名进行one-hot编码


#日期特征处理:因为后面fit() 要求输入的数据框都是数值格式的,而这个日期本身是字符串格式,如果要用的话,需要先对其进行转换
#对日期loans_latest_time,latest_query_time细分为年月周
X_date = pd.DataFrame()
X_date['latest_query_time_year'] = pd.to_datetime(X_str['latest_query_time']).dt.year#年
X_date['latest_query_time_month'] = pd.to_datetime(X_str['latest_query_time']).dt.month#月
X_date['latest_query_time_weekday'] = pd.to_datetime(X_str['latest_query_time']).dt.weekday#周
X_date['loans_latest_time_year'] = pd.to_datetime(X_str['loans_latest_time']).dt.year
X_date['loans_latest_time_month'] = pd.to_datetime(X_str['loans_latest_time']).dt.month
X_date['loans_latest_time_weekday'] = pd.to_datetime(X_str['loans_latest_time']).dt.weekday


#特征组合
X = pd.concat([X_num,X_str_oh,X_date],axis=1,sort=False)
print(X.shape)


#数据集划分
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=2018)

#构建模型
#1.逻辑回归
lr = LogisticRegression(random_state=2018)
lr.fit(X_train,y_train)
#2.SVM
svc = LinearSVC(random_state=2018)
svc.fit(X_train,y_train)
#3.tree
dt = tree.DecisionTreeClassifier(random_state=2018)
dt.fit(X_train,y_train)

#评价三种模型在测试集的表现
lr_acc = lr.score(X_test,y_test)
svc_acc = svc.score(X_test,y_test)
dt_acc = dt.score(X_test,y_test)
print("LogisticRegressiom Acc: %f, SVM Acc: %f, tree Acc: %f"%(lr_acc,svc_acc,dt_acc))

3代码的运行结果

#缺失值填为0的模型精度
LogisticRegressiom Acc: 0.748423, SVM Acc: 0.748423, tree Acc: 0.673441
#缺失值填为众数的模型精度
LogisticRegressiom Acc: 0.747722, SVM Acc: 0.252278, tree Acc: 0.672740

4遇到的问题

  1. 在加载数据时,一开始遇到个报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byte

原因是:‘utf-8’不能解码字节(0xbf),也就是这个字节超出了utf-8的表示范围了
解决方法:显式添加编码方式。添加:encoding=‘gbk’ 或’unicode_escape’编码。
2. 对于缺失值的处理有如下几种方式:
在这里插入图片描述
我在程序中用的是简单的方式,直接用0或众数代替,但二者最后模型运行的精度不同,缺失值填为0的模型精度大于缺失值填为众数的模型精度,这个是什么原因呢?

  1. 数据中的日期类型需要转换,因为后面训练模型fit() 要求输入的数据框都是数值格式的,而这个日期本身是字符串格式,如果要用的话,需要先对其进行转换。

参考

  1. Python之日期与时间处理模块(date和datetime)
  2. pandas的to_datetime时间转换使用方法以及学习的心得
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值