基于Python的人工智能应用案例系列(2):分类
在本篇文章中,我们将探讨分类问题,具体的应用场景是贷款审批预测。通过该案例,我们将学习如何使用Python处理分类问题,训练模型并预测贷款是否会被批准。
案例背景
该数据集包含贷款申请的相关信息,目标是预测贷款是否会被批准(Loan_Status为目标变量)。我们将使用多种特征,如性别、婚姻状态、申请人收入、信用记录等,来构建模型。数据集包含两个部分:
- 训练集:614个样本,13个特征,其中
Loan_Status为目标变量。 - 测试集:367个样本,12个特征,不含
Loan_Status列,用于最终测试模型性能。
主要特征
- Loan_ID - 贷款的唯一标识
- Gender - 性别(男/女)
- Married - 婚姻状态(已婚/未婚)
- Dependents - 家庭抚养人数
- Education - 教育水平(研究生/本科)
- Self_Employed - 自雇状态(是/否)
- ApplicantIncome - 申请人收入
- CoapplicantIncome - 共同申请人收入
- LoanAmount - 贷款金额
- Loan_Amount_Term - 贷款期限(月数)
- Credit_History - 信用历史(是否满足要求)
- Property_Area - 房产区域(城市/郊区/农村)
- Loan_Status - 贷款状态(是否批准)
1. 数据加载与初步检查
首先,我们需要导入必要的库并加载数据集。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 加载数据集
df_train = pd.read_csv("data/train_LoanPrediction.csv")
df_test = pd.read_csv("data/test_LoanPrediction.csv")# 查看数据形状和前几行
print(df_train.shape)
print(df_train.head())
2. 类别不平衡问题
通过统计Loan_Status的分布,我们发现数据存在类别不平衡问题,大部分样本是贷款已批准的(Loan_Status = Y)。
# 统计Loan_Status的分布
print(df_train['Loan_Status'].value_counts())
为了解决类别不平衡问题,我们可以使用下采样策略,使得Loan_Status的两类样本数量相等。
# 下采样处理
condY = df_train.Loan_Status == 'Y'
condN = df_train.Loan_Status == 'N'
df_trainY = df_train[condY].sample(n=192, random_state=999)
df_trainN = df_train[condN]
df_train = pd.concat([df_trainY, df_trainN])
3. 标签编码
由于分类变量是文本形式,我们需要将其转换为模型能够处理的数值形式。这里使用标签编码将Loan_Status和Education等列转换为数值。
from sklearn.preprocessing import LabelEncoderle = LabelEncoder()
df_train['Loan_Status'] = le.fit_transform(df_train['Loan_Status'])
df_train['Education'] = le.fit_transform(df_train['Education'])
df_test['Education'] = le.transform(df_test['Education'])
4. One-Hot编码
对于多类别变量(如Property_Area),我们使用One-Hot编码,避免模型误解类别之间的顺序。
df_train = pd.get_dummies(df_train, columns=['Property_Area'], drop_first=True)
df_test = pd.get_dummies(df_test, columns=['Property_Area'], drop_first=True)
5. 数据探索性分析(EDA)
通过EDA,我们可以更好地了解特征与目标变量之间的关系。
import seaborn as sns# 数值变量与Loan_Status的关系
num_col = df_train.select_dtypes(include=['int64', 'float64'])
for col in num_col.columns:sns.barplot(x=df_train['Loan_Status'], y=df_train[col])plt.show()# 类别变量的计数图
cat_col = df_train.select_dtypes(exclude=['int64', 'float64'])
for col in cat_col.columns:sns.countplot(x=df_train[col], hue=df_train['Loan_Status'])plt.show()
6. 处理缺失值
对缺失值进行处理非常重要。对于数值型变量,我们通常用中位数填充;而对于类别型变量,可以根据类别的比例填充。
# 处理缺失值
df_train['LoanAmount'].fillna(df_train['LoanAmount'].median(), inplace=True)
df_test['LoanAmount'].fillna(df_test['LoanAmount'].median(), inplace=True)# 信用历史的缺失值按比例填充
missing = df_train['Credit_History'].isna().sum()
ratio = df_train['Credit_History'].value_counts(normalize=True)
df_train['Credit_History'].fillna(np.random.choice([1, 0], p=[ratio[1], ratio[0]], size=missing), inplace=True)
7. 构建模型
在数据预处理完成后,我们可以开始构建分类模型。我们将使用Logistic回归、随机森林和支持向量机(SVM)等多种算法,并通过交叉验证选择最佳模型。
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import KFold, cross_val_score# 定义模型
lr = LogisticRegression(random_state=999)
rf = RandomForestClassifier(random_state=999)
sv = SVC(random_state=999)models = [lr, rf, sv]# 交叉验证
kfold = KFold(n_splits=5, shuffle=True, random_state=999)
for model in models:score = cross_val_score(model, df_train.drop(columns=['Loan_Status']), df_train['Loan_Status'], cv=kfold, scoring='accuracy')print(f"{model.__class__.__name__} - Accuracy: {score.mean()}")
8. 模型评估
我们使用准确率、精确率、召回率和F1得分等分类指标对模型进行评估。为了更好地理解模型的表现,我们还将使用混淆矩阵。
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report, confusion_matrix, ConfusionMatrixDisplay# 假设我们已经有预测结果pred_y
y_pred = rf.predict(df_train.drop(columns=['Loan_Status']))# 输出分类报告
print(classification_report(df_train['Loan_Status'], y_pred))# 混淆矩阵
cm = confusion_matrix(df_train['Loan_Status'], y_pred)
cmp = ConfusionMatrixDisplay(cm, display_labels=[0, 1])
cmp.plot()
9. 模型保存与加载
最后,我们将训练好的模型保存,以便后续使用。
import pickle# 保存模型
filename = 'model/Loan_Prediction.pkl'
pickle.dump(rf, open(filename, 'wb'))# 加载模型
loaded_model = pickle.load(open(filename, 'rb'))
结论
通过本文,我们成功地构建了一个用于预测贷款审批状态的分类模型。我们展示了如何处理类别不平衡问题、如何进行数据预处理、如何构建和评估分类模型。此案例提供了一个从数据到模型的完整流程,帮助您掌握分类问题的解决方法。
敬请期待后续的更多人工智能应用案例!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!
相关文章:
基于Python的人工智能应用案例系列(2):分类
在本篇文章中,我们将探讨分类问题,具体的应用场景是贷款审批预测。通过该案例,我们将学习如何使用Python处理分类问题,训练模型并预测贷款是否会被批准。 案例背景 该数据集包含贷款申请的相关信息,目标是预测贷款是否…...
演示:基于WPF自绘的中国省份、城市、区县矢量地图
一、目的:演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移,缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图(包含在表格中,包含缩率图) 显…...
同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?
看你现在使用的是核显还是独显 勾选上GPU引擎选项,后面便会标识你所使用的是哪种显卡,如果是独立显卡,就可以免去后续的操作;如果不是,那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1(独显&am…...
C++八股文之面向对象篇
🤖个人主页:晚风相伴-CSDN博客 思维导图链接:面向对象的性质 持续更新中…… 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 …...
点云深度学习系列:Sam2Point——基于提示的点云分割
文章:SAM2POINT:Segment Any 3D as Videos in Zero-shot and Promptable Manners 代码:https://github.com/ZiyuGuo99/SAM2Point Demo:https://huggingface.co/spaces/ZiyuG/SAM2Point 1)摘要 文章介绍了SAM2POINT,这是…...
mysql学习教程,从入门到精通,TOP 和MySQL LIMIT 子句(15)
1、TOP 和MySQL LIMIT 子句内容 在SQL中,不同的数据库系统对于限制查询结果的数量有不同的实现方式。TOP 关键字主要用于 SQL Server 和 Access 数据库中,而 LIMIT 子句则主要用于 MySQL、PostgreSQL(通过 LIMIT/OFFSET 语法)、S…...
备战软考Day02-数据结构与算法
1.基本概念与三要素 1.什么是数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2.数据元素、数据项 数据元素是数据的基本单位,通常作为一个整体进行…...
COMP 6714-Info Retrieval and Web Search笔记week1
哭了哭了,这周唯一能听懂的就这门 目录 IR(Information Retrieval)是什么?IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本(Comparing Text)IR的范围(Dimensions of IR)IR的任…...
C++在Linux实现多线程和多进程的TCP服务器和客户端通信
多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…...
音视频开发常见的开源项目汇总
FFmpeg 地址:https://ffmpeg.org/介绍:FFmpeg 是一个非常强大的开源多媒体框架,它可以用来处理视频和音频文件。它支持多种格式的转换、编码、解码、转码、流处理等。FFmpeg 包括了 libavformat、libavcodec、libavutil、libswscale、libpos…...
Java操控Redis (面经之 使用Redis)
操控Redis的工具 ReactiveRedisTemplate 和 RedisTemplate : RedisTemplate: 它是一个通用的模板类,可以使用任何序列化策略来序列化和反序列化键和值。默认情况下,它使用 JdkSerializationRedisSerializer 序列化值,并使用 Strin…...
【计网】从零开始使用UDP进行socket编程 --- 服务端业务实现
在我们每个人都曾经历过“沮丧”时刻里, 如果我们不能对别人说有益的好话, 那我们最好还是什么也别说。 --- 卡耐基 《人性的弱点》--- 从零开始使用UDP进行socket编程 1 前情提要2 单词翻译2.1 业务需求2.2 设计字典类2.3 服务端与客户端逻辑2.4 运…...
正式发售!《黑神话:悟空》背后的技术力量——UE5与实时云渲染
千呼万唤始出来,《黑神话:悟空》终于在今年8月发售了,相信大家都已经玩起来了! 作为国产游戏的画质巅峰之作,《黑神话:悟空》凭借其令人叹为观止的画面质量和游戏体验,赢得了广泛的好评。这一切…...
qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了
1、Qt的IDE一直在升级,qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本,官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…...
2024CSP-J初赛全真模拟卷选择题篇(原创,难度偏简单)
注意,本卷由再临TSC原创,禁止转载! 本卷难度偏简单,若想要通过初赛本卷应拿80分左右 查看答案的方法: if(设备"PC") { 把光标移到答案上面,选中答案,就会显示(); } …...
【Android 13源码分析】WindowContainer窗口层级-4-Layer树
在安卓源码的设计中,将将屏幕分为了37层,不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析,整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…...
C# 开发教程-中级教程
1.C# 多线程/异步 C# 异步编程Task整理(一) C# 异步编程Task整理(二)异常捕捉 C# 异步编程Task(三) async、await C#中创建线程,创建带参数的线程 C# 线程同步之排它锁/Monitor监视器类 C# lock关键词/lock语句块…...
【C++】c++的继承
目录 思维导图大纲: 1.基类和派生类 1.1 定义格式 1.2 继承方式 1.3 基类和派生类的转换 2. 继承中的作用域(隐藏关系) 2.1 考察继承作⽤域相关选择题 3. 派生类的默认成员函数 4. 继承类模板 5. 一个不能被继承的类 编辑 6.继承与友元 编辑 7. 继…...
【ShuQiHere】 进制转换的世界:从十进制到二进制、十六进制的转换技巧
【ShuQiHere】 在计算机科学中,进制转换(Radix Conversion) 是一个基础且非常重要的技能。无论是理解计算机的存储、数据表示,还是在编程中处理不同的进制数据,进制转换都是不可或缺的。本文将详细讲解 十进制&#x…...
《化工管理》
《化工管理》征稿简则 《化工管理》杂志是由中国石油和化学工业联合会主管、中国化工企业管理协会主办,1986年创刊,在国内外公开发行,国内统一连续出版物号:CN 11—3991/F,中国标准连续出版物号:ISSN 1008—…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
