首页 > 编程语言 >基于Python的人工智能应用案例系列(2):分类

基于Python的人工智能应用案例系列(2):分类

时间:2024-09-16 22:21:43浏览次数:12  
标签:Status 案例 Python Loan 人工智能 train df import 模型

        在本篇文章中,我们将探讨分类问题,具体的应用场景是贷款审批预测。通过该案例,我们将学习如何使用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_StatusEducation等列转换为数值。

from sklearn.preprocessing import LabelEncoder

le = 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'))

结论

        通过本文,我们成功地构建了一个用于预测贷款审批状态的分类模型。我们展示了如何处理类别不平衡问题、如何进行数据预处理、如何构建和评估分类模型。此案例提供了一个从数据到模型的完整流程,帮助您掌握分类问题的解决方法。

        敬请期待后续的更多人工智能应用案例!

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

标签:Status,案例,Python,Loan,人工智能,train,df,import,模型
From: https://blog.csdn.net/ljd939952281/article/details/142150511

相关文章

  • 【Azure Developer】通过SDK(for python)获取Azure服务生命周期信息
    问题描述需要通过PythonSDK获取Azure服务的一些通知信息,如:K8S版本需要更新到指定的版本,Azure服务的维护通知,服务处于不健康状态时的通知,及相关的操作建议等内容。 问题解答AzureResourceHealth是Azure提供的一项服务,旨在帮助用户了解其资源的健康状态。通过AzureResource......
  • 聪明办法学Python丨202409TASK1学习笔记
        踏入Python编程的世界之初,我便深刻地体会到了这门语言的独特魅力。Python凭借其简洁明了的语法与强大的功能性,迅速吸引了我的注意。相较于C语言等编译型语言,Python的语法更加接近自然语言,这使得即使是初次接触编程的人也能快速上手。Python的设计理念强调代码的可......
  • 如何利用Python进行数据分析与可视化的具体操作指南
    成长路上不孤单......
  • 用Python打造互动式中秋节庆祝小程序
    中秋节,这个充满传统韵味的节日,不仅是家人团聚的时刻,也是程序员展示创意的好机会。本文将引导您使用Python创建一个互动式中秋节庆祝小程序,它不仅能够展示节日祝福,还能通过一些简单的特效增加节日气氛。文章目录......
  • 用Python做一个小游戏
    首先,我们需要定义一个类,然后创建一副牌,最后实现一些基本的功能定义扑克牌类:classCard:def__init__(self,suit,rank):self.suit=suitself.rank=rankdef__repr__(self):returnf"{self.rank}of{self.suit}"创建一副扑克牌:suits=[......
  • 深入理解Python生成器、装饰器和异常处理
    一、Python生成器1.1什么是生成器?生成器(Generator)是Python中一种特殊的迭代器,它允许你在遍历大型数据集时节省内存。与普通函数不同,生成器函数使用yield关键字返回值,而不是return。生成器每次被调用时,函数的执行会在yield语句处暂停,并保存函数的状态,下一次再调用时从上次......
  • 【编程小白必看】python使用tkinter页面操作秘籍一文全掌握
    【编程小白必看】python使用tkinter页面操作秘籍......
  • Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析
     2.3.3集成阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了,接下来我们就需要在案例当中集成oss对象存储服务,来存储和管理案例中上传的图片。编辑在新增员工的时候,上传员工的图像,而之所以需要上传员工的图像,是因为将来我们需要在系统页面当中访问并展示员工的图像。......
  • 用python写一段代码:读取一张图片中的所有颜色信息,并按照占比大小,从大到小依次列出颜色
    fromPILimportImagefromcollectionsimportCounterimportnumpyasnpdefsave_colors_to_file(image_path,output_file):#打开图片文件image=Image.open(image_path)image=image.convert('RGB')#将图片转换为numpy数组pixels=np.ar......
  • [Python手撕]归并排序
    classSolution:defsortArray(self,nums:List[int])->List[int]:defmerge(nums1,nums2):ifnotnums1andnotnums2:returnNoneifnotnums1:returnnums2ifnotnums2......