赞
踩
数据说明
数据概述 :
数据包括脱敏后的个人基本信息、持卡信息、消费信息及信贷信息等。详见字段解释.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))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。