基于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—…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
