当前位置:   article > 正文

数据挖掘大作业

数据挖掘大作业

数据挖掘大作业


题目要求
本次设计要求实现信贷用户逾期预测功能。具体要求如下:利用所学数据挖掘算法对给定数据进行训练得出信用评估模型,依据模型对1000个贷款申请人是否逾期做出预测(0-未逾期 1-逾期)。

数据说明
数据概述 :
数据包括脱敏后的个人基本信息、持卡信息、消费信息及信贷信息等。详见字段解释.xlsx。
数据结构和数据规模 :
数据分为训练集和验证集。 详见model.csv和test.csv

编程环境及语言:
编程环境:Python 3.7 Jupyter notebook
语言:Python

算法思想:
SVM是被公认的比较优秀的分类模型。其主要思想为找到空间中的一个更够将所有数据样本划开的超平面,并且使得本本集中所有数据到这个超平面的距离最短。基于训练集在样本空间中找到一个划分超平面,将不同类别的样本分开。

算法伪码:
#将训练集和测试集数据读取
model=pandas.read_csv(“model.csv”)
test=pandas.read_csv(“test.csv”)
#数据预处理,删除没用和缺失值过多的列
model=model.drop([‘user_id’,…],axis=1)
test=test.drop([‘user_id’,…],axis=1)
#剩余缺失的空值填充中位数
model.iloc[:,1:]=model.iloc[:,1:].fillna(model.iloc[:,1:].median())
test=test.fillna(test.median())
#划分训练数据测试数据
modely=model[‘y’]
modelx=model.drop([‘y’],axis=1)
X_train, X_test, y_train, y_test=train_test_split(modelx,modely,test_size=0.2,random_state=135)
#模型训练
linearSVC = LinearSVC()
linearSVC.fit(X_train, y_train)
#预测test
linearSVC_predict = linearSVC.predict(test)

数据预处理:
1.把要用的包导入
在这里插入图片描述

2.把数据读入,查看一下数据的缺失情况,发现有的列缺失率比较高
在这里插入图片描述

3.将没用的列和缺失多的列去掉,剩余的缺失值用中位数填充(这里我额外写了一个函数用于判断哪些列要删除)
在这里插入图片描述

4.划分数据集:
在这里插入图片描述

5.数据归一化(如果数据点在不同的维度上的量纲不同,会使得距离的计算有问题)
在这里插入图片描述

核心算法:本次试验我主要使用了SVM中的LinearSVC
在这里插入图片描述

准确率:

预测结果:
0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
sum函数求出有197个1,及预测有197人逾期
在这里插入图片描述

结果分析:
在这1000个预测结果中1的个数为197个,按照model里的概率这一值应该在200左右,还是比较符合的。

调试过程:
1.实验结果总是变化,因为划分数据集时随机种子没设置定值,在函数中传入random_state参数

2.LinearSVC的参数dual是布尔值。如果为true,则求解对偶问题。如果为false,解决原始问题。当样本数量>特征数量时,倾向采用解原始问题。所以将dual=False传入。

py文件:

import pandas
from sklearn.model_selection import train_test_split
from  sklearn.svm import LinearSVC
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

#数据集读取
model=pandas.read_csv("model.csv")#训练集
test=pandas.read_csv("test.csv")#测试集
pandas.set_option('display.max_rows', None)
model.isnull().sum()#查看各列缺失值个数

#删除没用或者缺失值较多列
model=model.drop(['user_id'],axis=1)
test=test.drop(['user_id'],axis=1)
#定义函数计算列缺失率并删除缺失率高于指定值的列
def drop_col(df, col_name, cutoff):
    n = len(df)
    cnt = df[col_name].count()
    if (float(cnt) / n) < cutoff:
        df.drop(col_name, axis=1, inplace=True)
        test.drop(col_name, axis=1, inplace=True)
#遍历训练集调用上面函数
for i in model:
    drop_col(model,i,0.01)
#剩下的缺失值用中位数填充
model.iloc[:,1:]=model.iloc[:,1:].fillna(model.iloc[:,1:].median())
test=test.fillna(test.median())
#划分特征和标签
modely=model['y']
modelx=model.drop(['y'],axis=1)
#划分数据集
X_train, X_test, y_train, y_test=train_test_split(modelx,modely,test_size=0.2,random_state=135)

#数据归一化
from sklearn.preprocessing import minmax_scale
  # 归一化,缩放到0-1
X_train = minmax_scale(X_train)
X_test =  minmax_scale(X_test)


# 模型训练
linearSVC = LinearSVC(dual=False)
linearSVC.fit(X_train, y_train)
linearSVC_predict = linearSVC.predict(test)
for i in linearSVC_predict:
    print(i,end=' ')
size=sum(linearSVC_predict[linearSVC_predict==1])
print(size)
#输出结果
print("predict:",linearSVC.score(X_test, y_test))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/425380
推荐阅读
  

闽ICP备14008679号