目录:
数据集来源
算法介绍
集成学习
模型评估
代码实战
总结
源码与论文资料领取链接:
领取链接https://s.pdb2.com/pages/20231107/cNttH3oeFf2ifi6.html
数据集来源:前列腺预警数据集![](https://i-blog.csdnimg.cn/blog_migrate/006b9e5059797875bb6692d23c998cc9.png)
算法简介:
Logistic regression
逻辑回归,也被称为logit回归模型,通常用于分类和预测分析。它可以估计事件发生的概率,比如投票或不投票,基于一组独立变量的给定数据集。由于结果是一个概率,因变量被限制在0和1之间。在逻辑回归中,对赔率进行了logit转换,即成功的概率除以失败的概率。这也常被称为对数几率,或者自然对数的几率,逻辑函数由以下公式表示:
在这个逻辑回归方程中,logit(pi)是因变量或响应变量,x是自变量。在这个模型中,beta参数或系数通常通过最大似然估计(MLE)进行估计。这种方法通过多次迭代测试不同的beta值,以优化对log odds的最佳拟合。所有这些迭代产生了对数似然函数,逻辑回归试图最大化此函数以找到最佳的参数估计。一旦找到了最佳系数(如果有多个自变量,则为多个系数),就可以计算每个观测值的条件概率,并对它们进行对数化和求和,从而得出预测概率。对于二元分类,概率小于0.5的将预测为0,而概率大于0的将预测为1。计算完模型后,最好评估模型对因变量的预测效果,这就是拟合度。Hosmer-Lemeshow检验是一种常用的方法来评估模型拟合度。
Naive Bayes
朴素贝叶斯分类方法是一种基于贝叶斯定理的简单概率分类器。这种方法的“朴素”之处在于它假设所有特征之间相互独立,即一个特征的存在或某个条件已经成立并不会影响其他特征的存在概率。
朴素贝叶斯分类器的工作原理可以描述如下:
1. 贝叶斯定理: 该算法的核心是贝叶斯定理,该定理描述了两个条件概率之间的关系:一是在已知某个条件下事件发生的概率,一是已知事件发生下条件存在的概率。公式通常写作
- P(A) 是 A 事件本身的概率,称为先验概率。
- P(B|A) 是已知 A 发生时 B 发生的条件概率,称为似然度。
- P(A|B) 是已知 B 发生时 A 发生的条件概率,称为后验概率。
- P(B) 是 B 事件本身的概率。
2. 独立性假设: 在朴素贝叶斯中,独立性假设意味着给定目标值,认为各特征存在的概率互不影响。例如,在垃圾邮件检测中,算法将假设单词“免费”出现的概率与单词“优惠”出现的概率无关。
3. 分类决策: 在得到了后验概率之后,朴素贝叶斯会选择具有最高后验概率的类别作为预测分类。
4. 应用领域: 由于它的简单性,朴素贝叶斯分类器在文本分类(比如垃圾邮件或情感分析)、疾病预测和客户分类等领域被广泛使用。
朴素贝叶斯方法的优点在于计算效率高,尤其是在特征维度较大时;缺点是因为独立性假设过于简化,有时候在现实世界中可能得不到很准确的结果。尽管如此,朴素贝叶斯因其实现简单和效率高而在很多情况下仍是一个不错的选择。
Decision trees
决策树是一种基于树结构来进行决策的算法。它通过将数据集按照某些特征进行分割,不断地分割,直到各个子集都尽可能地属于同一类别。每个非叶节点代表一个特征属性上的测试,每个分支代表测试的结果,而每个叶节点代表一个类(分类问题)或一个值(回归问题)。决策树的优点在于易于理解和实现,缺点是容易过拟合,对于数据中的噪声比较敏感。
Random Forest
随机森林是一种集成学习方法,它构建多个决策树,并将它们的预测结果进行整合来提高整体的预测准确率。在分类问题中,随机森林通常通过投票的方式来决定最终分类,即选择得票最多的类别。它的优势在于模型有很高的准确度,抗过拟合能力强,并且能够有效处理大量的输入变量。但是随机森林模型有时比较复杂,需要较长的训练时间。
K-nearest Neighbors Algorithm
KNN是一种基于实例的学习,或者说是惰性学习,它根据最邻近的一个或几个样本的类别来预测新样本的类别。基本流程是在训练集中找到与新样本最近的k个样本,然后根据这k个样本的类别信息来预测新样本的类别。KNN算法简单直观,但是如果训练集很大,可能会导致分类时的计算量非常大,而且对于不平衡的数据,少数类别可能会被忽視。
Support vector machines
支持向量机是一种强大的分类器,它在特征空间中寻找最佳的线性可分边界,即最大化两个类别之间的边缘。SVM适用于中小规模数据集的分类问题,在处理非线性问题时通常结合核技巧使用。优点是泛化能力比较强,对于特征的数量超过样本数量的数据集也表现良好;缺点则包括模型参数比较难以解释,计算上也较为复杂。
XGBoost
XGBoost是增强树算法的一种实现,全称是eXtreme Gradient Boosting。XGBoost算法通过组合多个决策树来提升性能,是一种集成学习方法。每棵树都在尝试纠正前面树的错误,通过不断迭代,来提高模型的预测性能。XGBoost具有处理大规模数据、速度快、效果好、灵活性高等优点,并且在许多机器学习竞赛中被广泛使用。不过该算法涉及到相对复杂的调参,对于初学者来说,入门可能会有一些难度。
Cross-validation(for parameter tuning)
交叉验证是一种统计学上将样本数据划分为多个子集的方法,用于评估机器学习模型在独立数据集上的性能。常用的交叉验证方法有 k 折交叉验证(k-fold cross-validation)。
在 k 折交叉验证中,数据集被分为k个大小相似的互斥子集,每次用其中的k-1个子集作为训练数据,剩下的一个子集用作测试数据,这个过程重复k次,每次选择不同的子集作为测试数据且每个子集都精确地被测试一次。然后将k次的测试结果平均,作为总的性能评估结果。
交叉验证主要用于模型调参,在模型选择和参数调整阶段非常有用,因为它可以防止模型过分拟合于一组特定的训练数据。此外,由于交叉验证对每个样本点都进行了测试,因此它还可以提高模型泛化能力估计的准确性。在数据量不是特别大的情况下,交叉验证是一个非常有用的工具,但缺点是会增加计算成本,因为模型需要训练多次。
The ROC Curve(for model evaluation)
ROC 曲线是一种用于评估二分类问题中机器学习模型性能的工具,它通过将真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR)以图形化的方式展现出来,来展示模型在所有分类阈值下的表现能力。其中:
- TPR 表示的是正例被正确识别的概率,计算公式为 TPR = TP / (TP + FN),其中 TP 是真正例数量,FN 是假反例数量。
- FPR 表示模型将负例错误地判定为正例的概率,计算公式为 FPR = FP / (FP + TN),其中 FP 是假正例数量,TN 是真反例数量。
ROC 曲线下的面积(Area Under Curve, AUC)可用于量化分类器的性能。AUC 的值介于0和1之间,AUC 越接近1表示分类器的性能越好,若是0.5则意味着分类器的性能与随机猜测无异。
代码部分:
源码与论文资料领取链接:
领取链接https://s.pdb2.com/pages/20231107/cNttH3oeFf2ifi6.html
必要的库的导入
可视化部分
输出:
绘制各指标与Label的直方图:
模型训练:
归一化与数据集分割:
逻辑回归:
打印混淆矩阵:
为避免篇幅过长,其他模型训练具体代码可参见文章:
7种机器学习方法http://t.csdnimg.cn/W3kPa
源码与论文资料领取链接:
领取链接https://s.pdb2.com/pages/20231107/cNttH3oeFf2ifi6.html
7种分类的模型评估:
lr_false_positive_rate,lr_true_positive_rate,lr_threshold = roc_curve(y_test,lr_predict)
nb_false_positive_rate,nb_true_positive_rate,nb_threshold = roc_curve(y_test,nbpred)
rf_false_positive_rate,rf_true_positive_rate,rf_threshold = roc_curve(y_test,rf_predicted)
xgb_false_positive_rate,xgb_true_positive_rate,xgb_threshold = roc_curve(y_test,xgb_predicted)
knn_false_positive_rate,knn_true_positive_rate,knn_threshold = roc_curve(y_test,knn_predicted)
dt_false_positive_rate,dt_true_positive_rate,dt_threshold = roc_curve(y_test,dt_predicted)
svc_false_positive_rate,svc_true_positive_rate,svc_threshold = roc_curve(y_test,svc_predicted)
sns.set_style('whitegrid')
plt.figure(figsize=(10,5))
plt.title('Reciver Operating Characterstic Curve')
plt.plot(lr_false_positive_rate,lr_true_positive_rate,label='Logistic Regression')
plt.plot(nb_false_positive_rate,nb_true_positive_rate,label='Naive Bayes')
plt.plot(rf_false_positive_rate,rf_true_positive_rate,label='Random Forest')
plt.plot(xgb_false_positive_rate,xgb_true_positive_rate,label='Extreme Gradient Boost')
plt.plot(knn_false_positive_rate,knn_true_positive_rate,label='K-Nearest Neighbor')
plt.plot(dt_false_positive_rate,dt_true_positive_rate,label='Desion Tree')
plt.plot(svc_false_positive_rate,svc_true_positive_rate,label='Support Vector Classifier')
plt.plot([0,1],ls='--')
plt.plot([0,0],[1,0],c='.5')
plt.plot([1,1],c='.5')
plt.ylabel('True positive rate')
plt.xlabel('False positive rate')
plt.legend()
plt.show()
输出:
scv=StackingCVClassifier(classifiers=[svc,svc,svc,svc,svc,svc,knn,knn,knn,rf],meta_classifier= svc,random_state=42)
scv.fit(X_train,y_train)
scv_predicted = scv.predict(X_test)
scv_conf_matrix = confusion_matrix(y_test, scv_predicted)
scv_acc_score = accuracy_score(y_test, scv_predicted)
print("confussion matrix")
print(scv_conf_matrix)
print("\n")
print("Accuracy of StackingCVClassifier:",scv_acc_score*100,'\n')
print(classification_report(y_test,scv_predicted))
集成学习:
结果准确率进一步提高