背景介绍
在当今社会,婚姻关系的稳定性受到了多方面因素的影响,包括经济压力、沟通问题、个人价值观差异等。离婚不仅对夫妻双方产生深远的影响,还可能对子女的成长环境和社会稳定造成不利影响。因此,理解并预测可能导致离婚的因素变得尤为重要。通过数据分析和机器学习技术,我们可以探索这些潜在因素,并建立模型来预测离婚的可能性。这样的研究不仅可以帮助夫妻提前识别和解决潜在问题,还可以为婚姻咨询师和家庭治疗师提供有价值的工具,以支持他们的工作。
项目目标
本项目的目的是利用机器学习方法来探索和分析影响离婚的各种因素,并建立一个可靠的预测模型。具体目标包括:
- 探索影响离婚的因素:通过数据分析,揭示哪些因素最有可能导致离婚,例如沟通方式、价值观差异、信任度等。
- 建立预测模型:使用多种机器学习算法(如逻辑回归、随机森林、支持向量机等)构建预测模型,评估其性能,并选择最优模型。
- 提供实用建议:基于模型结果,提出有助于维持婚姻稳定性的建议,帮助夫妻识别和解决潜在问题。
数据
这里我增加了对数据的中文解释,网盘自取:
数据处理
检查数据分布
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