利用机器学习预测离婚:从数据分析到模型构建(含方案和源码)

背景介绍


在当今社会,婚姻关系的稳定性受到了多方面因素的影响,包括经济压力、沟通问题、个人价值观差异等。离婚不仅对夫妻双方产生深远的影响,还可能对子女的成长环境和社会稳定造成不利影响。因此,理解并预测可能导致离婚的因素变得尤为重要。通过数据分析和机器学习技术,我们可以探索这些潜在因素,并建立模型来预测离婚的可能性。这样的研究不仅可以帮助夫妻提前识别和解决潜在问题,还可以为婚姻咨询师和家庭治疗师提供有价值的工具,以支持他们的工作。

项目目标


本项目的目的是利用机器学习方法来探索和分析影响离婚的各种因素,并建立一个可靠的预测模型。具体目标包括:

  • 探索影响离婚的因素:通过数据分析,揭示哪些因素最有可能导致离婚,例如沟通方式、价值观差异、信任度等。
  • 建立预测模型:使用多种机器学习算法(如逻辑回归、随机森林、支持向量机等)构建预测模型,评估其性能,并选择最优模型。
  • 提供实用建议:基于模型结果,提出有助于维持婚姻稳定性的建议,帮助夫妻识别和解决潜在问题。

 数据

这里我增加了对数据的中文解释,网盘自取:

数据点这里

数据处理

检查数据分布

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"]= 'SimHei' # 消除中文乱码

data_train = pd.read_excel('./divorce.xlsx') #这里要注意你的数据存放的位置

class_counts = data_train['Class'].value_counts()
print(class_counts)

结果如下:

这里我们可以看到数据结果的分布是很平均的,所以不需要进行上采样或者下采样,关于上采样或者下采样的场景,可以看这篇:点这里

查看数据内容和缺失值

missing_values = data_train.isnull().sum()
print("\n缺失值情况:")
print(missing_values)

print(data_train.info())
print(data_train.describe())

结果如下

这里的数据是官方数据没什么问题,没有缺失值的情况,如果有缺失值我们需要根据实际情况来填充

 查看数据特征方差图

xfc = data_train.cov()
cov = []
for i in range(data_train.shape[1]-1):
    cov.append(xfc.iloc[i, i])
plt.bar(data_train.columns[:-1], np.array(cov))
plt.title(u"各特征方差")
plt.xlabel("特征")
plt.ylabel(u"方差")
plt.show()

结果:

特征工程 

递归特征消除法 (RFE)

RFE 是一种基于模型的特征选择方法。它通过递归地移除不重要的特征来选择最佳特征子集。具体步骤如下:

  • 训练一个基模型:通常使用逻辑回归、支持向量机等模型。
  • 计算特征的重要性:基于模型的系数或特征重要性。
  • 移除最不重要的特征:根据特征的重要性排序,移除最不重要的特征。
  • 重复上述步骤:直到达到指定的特征数量。
# 得到特征和Label(numpy矩阵)
all_X = data_train.drop('Class', axis=1).values
all_y = data_train['Class'].values

clf = LogisticRegression(C=0.4, penalty='l2', tol=1e-6)

rfecv = RFECV(estimator=clf, step=1, cv=3, scoring='accuracy')
rfecv.fit(all_X, all_y)
print("最佳特征数量 : %d" % rfecv.n_features_)
print("对应特征的排名 : %s" % rfecv.ranking_)

 结果:

这里可以看到有四个特征排名都是1 

绘制一下交叉验证的得分

plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score (nb of correct classifications)")

# 使用 cv_results_ 属性来获取交叉验证结果
cv_results = rfecv.cv_results_
mean_scores = cv_results['mean_test_score']
std_scores = cv_results['std_test_score']

# 绘制交叉验证得分
plt.errorbar(range(1, len(mean_scores) + 1), mean_scores, yerr=std_scores, fmt='-o')
plt.show()

结果如下:

 

这里我们会发现特征数量到一定程度后,模型的性能并没有显著提高。这意味着模型已经达到了一个“饱和点”,在这个点之后,增加更多的特征并不会显著提高模型的性能。 

所以这里我们选择排名小于等于4的特征用于后面的训练

# 获取最优特征的索引
best_features_indices = np.where(rfecv.ranking_ <= 4)[0]
best_features_names = data_train.columns[best_features_indices].tolist()

top_features_indices = np.where(rfecv.ranking_ <= 4)[0]

# 打印最优特征的名字
print("Best feature names: %s" % best_features_names)

# 选择这些特征
X_top = all_X[:, top_features_indices]

# 输出这些特征的数据
print("Selected features data shape: ", X_top.shape)

如下:

训练 

分割数据训练

# 数据分割
X_train, X_test, y_train, y_test = train_test_split(X_top, all_y, test_size=0.2, random_state=42)

# 模型训练
model = LogisticRegression(C=0.4, penalty='l2', tol=1e-6)
model.fit(X_train, y_train)

# 交叉验证
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print("Cross-validation scores: ", cv_scores)
print("Mean cross-validation score: %.2f" % np.mean(cv_scores))

结果

预测和性能评估 

# 预测
y_pred = model.predict(X_test)

# 性能评估
accuracy = accuracy_score(y_test, y_pred)
print("测试准确率: %.2f" % accuracy)

# 打印分类报告
print("分类报告:")
print(classification_report(y_test, y_pred))

 结果如下:

总结

在本文中,我们详细介绍了如何使用递归特征消除法(RFE)和递归特征消除与交叉验证(RFECV)进行特征选择,并展示了如何在离婚预测数据集上应用这些方法。通过 RFECV,我们确定了最佳的特征数量,并选择了排名为 1、2、3 和 4 的特征。我们还进行了模型训练、交叉验证和性能评估,确保模型在测试集上的表现良好。

关键步骤回顾

  • 数据预处理:读取数据并提取特征和标签。
  • 特征选择:使用 RFECV 选择最优特征数量,并提取排名靠前的特征。
  • 数据分割:将数据集分为训练集和测试集。
  • 模型训练:使用逻辑回归模型进行训练。
  • 交叉验证:通过交叉验证评估模型的性能。
  • 性能评估:计算测试集上的准确率,并打印分类报告和混淆矩阵。
  • 结果分析

通过特征选择和模型训练,我们发现当特征数量达到一定数量后,模型的性能趋于稳定。这表明选择合适的特征数量可以提高模型的泛化能力和计算效率。最终,我们的模型在测试集上表现出良好的性能,达到了预期的效果。

未来工作

  • 进一步优化:可以尝试不同的模型和参数设置,以进一步提高模型性能。
  • 特征工程:探索更多的特征构造方法,以增强模型的预测能力。
  • 业务解释:深入分析所选特征的具体含义和重要性,确保它们在业务上有实际意义。

希望这篇文章对你理解和应用特征选择方法有所帮助。如果你有任何问题或需要进一步的帮助,请随时联系我。感谢阅读!

最后全部的源码:https://pan.quark.cn/s/bad9a4b62cf3 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分层架构 IM 系统之 Router 架构分析

通过前面文章的分析&#xff0c;我们已经明确&#xff0c;Router 的核心职责是作为中央存储记录在线客户端的连接状态&#xff0c;Router 在本质上是一个内存数据库。 内存是一种易失性的存储&#xff0c;既如此&#xff0c;Router 的可用性如何保障呢&#xff1f; 副本是分布…

二分查找常规实现

使用二分查找有一个前提条件&#xff1a;要查找的数必须在一个有序数组里。在这个前提下&#xff0c;取中间位置数作为比较对象&#xff1a; 若要查找的值和中间数相等&#xff0c;则查找成功。 若小于中间数&#xff0c;则在中间位置的左半区继续查找。 若大于中间数&#x…

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…

获取联通光猫的管理员密码

缘起&#xff1a;联通给免费更换了一个新的光猫&#xff0c;烽火的光路由&#xff0c;一个WAN口&#xff0c;4个LAN口&#xff0c;带USB接口&#xff0c;欣欣然接受。但是呢&#xff0c;发现以前的管理员密码CUAdmin不能用了。经过一系列查询&#xff0c;借助别人的经验&#x…

数组练习(非最终版)

作业1&#xff1a;使用二维数组输出杨辉三角 //杨辉三角 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int i,j,n;scanf("%d",&n);int arr[n][n];for(i0;i<n;i){arr[i][0]1;arr[…

【MySQL 进阶之路】索引概述

第06章_索引 1.什么是索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查…

微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution

3.3 Trigonometric Substitution - Calculus Volume 2 | OpenStax

业财一体化新篇章:外贸ERP软件重塑业务流程

业财一体化的定义&#xff08;Definition&#xff09; FMS&#xff0c;即财务管理软件&#xff08;Financial Management Software&#xff09;&#xff0c;涵盖了用于管理公司财务的多种工具和系统&#xff0c;包括预算管理、账务处理、报表生成等功能。 ERP&#xff0c;即企…

Qt 信号与槽:UI设计的基础

Qt 的信号与槽机制是其最强大的功能之一&#xff0c;也是初学者理解 Qt 的第一步。它让对象之间的通信变得直观和高效。信号与槽类似于现实生活中的“呼叫和应答”模式&#xff1a;一个对象发出信号&#xff0c;另一个对象响应并执行动作。 什么是信号与槽&#xff1f; 信号与…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下&#xff1a; QT C 两个QWideget A B现在有放在一个窗口QWideget Test内&#xff0c;初始比例要2&#xff1a;8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时&#xff0c;有条线&#xff0c;可以左右移动来控件 A B 窗口所占的大小widgetB &#xff08;有 wi…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…

基于PyTorch框架的线性回归实现指南

目录 ​编辑 1. 线性回归基础 2. PyTorch环境搭建 3. 数据准备 4. 定义线性回归模型 5. 损失函数和优化器 6. 训练模型 7. 评估模型 8. 结论 线性回归是统计学和机器学习中最基本的预测模型之一&#xff0c;它试图找到输入特征和输出结果之间的线性关系。在深度学习框…

HYSPLIT下载及使用

准备工作 官网基础教程&#xff1a;https://www.ready.noaa.gov/documents/Tutorial/html/index.html 使用 参考&#xff1a;https://blog.csdn.net/liaohaibing/article/details/112788701 下载之前还需要Graphical Utilities&#xff1a;https://www.ready.noaa.gov/HYSPLI…

基于Java Springboot环境保护生活App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

骨架行为识别-论文复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 &#xff08;一般N卡自带的CUDA版本与最新的torch版本相差较大&#xff09; 解决方案 1.查看自己的CUDA版本 # 查看自己的…

Kylin Server V10 下基于Kraft模式搭建Kafka集群

一、Kraft 模式与 ZooKeeper 模式简介 在Kafka 2.8 之前,Kafka 重度依赖 ZooKeeper 集群做元数据管理、Controller 的选举等(统称为共识服务);当ZooKeeper 集群性能发生抖动时,Kafka 的性能也会受到很大的影响。如下图所示: 在 Kafka 2.8 之后,引入了基于 Raft …

ceph手动部署

ceph手动部署 一、 节点规划 主机名IP地址角色ceph01.example.com172.18.0.10/24mon、mgr、osd、mds、rgwceph02.example.com172.18.0.20/24mon、mgr、osd、mds、rgwceph03.example.com172.18.0.30/24mon、mgr、osd、mds、rgw 操作系统版本&#xff1a; Rocky Linux release …

记录vite关于tailwindcss4.0-bate4出现margin[m-*]、padding[p-*]无法生效的问题。

环境如下&#xff1a; vite:5.4.10 tailwindcss: 4.0.0-beta.4 tailwindcss/vite: 4.0.0-beta.4 4.0默认的样式优先级比较低 如果使用了一些reset的css文件 那么很多样式会失效 例如&#xff1a;reset.css中 html, body, ul, li, h1, h2, h3, h4, h5, h6, dl, dt, dd, ol, i…

AcWing 841. 字符串哈希

字符串哈希 一种将任意长度的字符串转换为固定长度数值&#xff08;通常是整数&#xff09;的过程。全称字符串前缀哈希法&#xff0c;把字符串变成一个p进制数字&#xff08;哈希值&#xff09;&#xff0c;实现不同的字符串映射到不同的数字。 对形如 X1X2X3⋯Xn−1Xn 的字…