前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python机器学习-02:模型构建

Python机器学习-02:模型构建

作者头像
Jamesjin63
发布2022-11-03 15:09:34
4630
发布2022-11-03 15:09:34
举报
文章被收录于专栏:EpiHubEpiHub

写在前面

随着人工智能时代的到来,机器学习已成为解决问题的关键工具,如识别预测疾病风险等。Python是实现机器学习的热门语言之一。接下来会详细介绍机器学习如何应用到实际问题,并概括通过Python进行实际操作。

一般建立机器学习的流程如下: 数据选择是准备机器学习的关键,其中机器学习广泛流传一句话:数据和特征决定了机器学习结果的上限,而模型算法只是尽可能逼近这个上限,意味着数据及其特征表示的质量决定了模型的最终效果,且在实际应用中,算法通常占了很小的一部分,大部分的工作都是在找数据、提炼数据、分析数据及特征工程。

image.png

所以,数据质量差或无代表性,会导致模型拟合效果差。 本文是针对于[模型构建],[模型评估]部分,展示在Python里构建机器学习模型,并对模型进行评估。

乳腺癌预测

本例选用的是sklearn上的数据集版本:Breast Cancer Wisconsin DataSet(威斯康星州乳腺癌数据集),这些数据来源美国威斯康星大学医院的临床病例报告,每条样本有30个变量(Feature),结局变量为否良性肿瘤。

思路是通过分析乳腺癌数据集数据,变量EDA分析,构建分类回归模型,预测样本的类别是否为良性肿瘤。

1.数据概览

这里利用Jupyter Notebook对乳腺癌数据进行展示。

image.png

代码语言:javascript
复制
## 这里输出模型的预测结果
# 需要将数据整理成dataframe格式
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy as sp
import warnings
import os 
warnings.filterwarnings("ignore")
import datetime
from sklearn.metrics import roc_auc_score
from math import sqrt

## 读取数据
data=pd.read_csv('/Users/Anderson/Desktop/PhDwork/Py-Github/ML-code-edit/BCdata.csv')
print(data.shape) 

## 这里替换结局变量为0跟1.
data.replace({"diagnosis":{"M":1,"B":0}},inplace=True)
data.head() 

当然更多的查看数据格式命令如下

代码语言:javascript
复制
## 类似summary
data.describe()
## 查看数据的类型,如字符串还是inter
data.info()
## 查看数据缺失值
data.isnull().sum()

这里输出变量的名字,同R语言类似。

代码语言:javascript
复制
data.columns 

Index(['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean',
       'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
       'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
       'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
       'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
       'fractal_dimension_se', 'radius_worst', 'texture_worst',
       'perimeter_worst', 'area_worst', 'smoothness_worst',
       'compactness_worst', 'concavity_worst', 'concave points_worst',
       'symmetry_worst', 'fractal_dimension_worst', 'Unnamed: 32'],
      dtype='object')

通过上述的简单处理,我们看到Unnamed有很多NA,所以要讲Unnamed去掉,另外id也不需要。

代码语言:javascript
复制
data.drop('Unnamed: 32', axis = 1, inplace = True)

如果不懂drop操作,可以在drop后添加?,就会有操作提示。

image.png

2.数据拆分

这里是数据拆分是为模型构建准备;按照8:2比例;注意,这里面是将自变量X与因变量Y分开进行拆分。所以会有x_train,x_test,y_train,y_test四个对象,这都是为了后续建立模型而服务。因为模型里面需要指定哪些是自变量X与因变量Y。

代码语言:javascript
复制
# Getting Features
x = data.drop(columns =['diagnosis'])
# Getting Predicting Value
y = data['diagnosis']

# train_test_splitting of the dataset
from sklearn.model_selection import train_test_split 
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)
print(len(x_train));len(x_test)

3.模型构建

这里面,选择多种机器学习算法对训练集数据进行训练,然后用测试集数据进行评估。 这里用的算法:Logistic Regression逻辑回归;参考sklearn官网的介绍。 sklearn里面介绍了多种算法模型。

代码语言:javascript
复制
from sklearn.linear_model import LogisticRegression
reg = LogisticRegression() # 实例化LM模型
reg.fit(x_train,y_train)   # 用训练集进行训练

y_pred=reg.predict(x_test) # 用测试集进行预测        

image.png

4.模型评估

我们对测试集114个数据进行预测,上面显示了y_pred预测最终结局,但是我们还需要知道预测每个结局的概率,这样我们就可以计算AUC等指标。

代码语言:javascript
复制
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix,r2_score
# ROC plot
y_pred_quant = reg.predict_proba(x_test)[:, 1]
y_pred_quant
array([0.4997938 , 0.49794798, 0.49979521, 0.49979908, 0.49980748,
       0.49979368, 0.49997968, 0.49979873, 0.49979258, 0.49979763,
       ...
       0.49979348, 0.49979549, 0.49979355, 0.49979398])

预测的乳腺癌与真实值比较得到matrix矩阵,即可计算Precision准确率等指标

image.png

代码语言:javascript
复制
print(classification_report(y_test,y_pred))
print(confusion_matrix(y_test,y_pred))
print("Training Score: ",reg.score(x_train,y_train)*100)

image.png

Roc及95%CI计算。

这里需要自建一个函数,实现95CI%。参考 ROC曲線置信区间官网的介绍。

代码语言:javascript
复制
## 返回模型AUC
def roc_auc_ci(y_true, y_score, positive=1):
    AUC = roc_auc_score(y_true, y_score)
    N1 = sum(y_true == positive)
    N2 = sum(y_true != positive)
    Q1 = AUC / (2 - AUC)
    Q2 = 2*AUC**2 / (1 + AUC)
    SE_AUC = sqrt((AUC*(1 - AUC) + (N1 - 1)*(Q1 - AUC**2) + (N2 - 1)*(Q2 - AUC**2)) / (N1*N2))
    lower = AUC - 1.96*SE_AUC
    upper = AUC + 1.96*SE_AUC
    if lower < 0:
        lower = 0
    if upper > 1:
        upper = 1
    return (AUC,lower, upper)

rocci=roc_auc_ci(y_test, y_pred_quant,positive=1)
print(rocci)

(0.4525246109876151, 0.3455881139161042, 0.559461108059126)

模型的准确性不高。AUC=0.45

代码语言:javascript
复制
TN, FP, FN, TP = confusion_matrix(y_test, y_pred).ravel()
specificity = TN / (TN + FP)
recall = TP/ (TP + FN)
precision = TP / (TP + FP)
f_measure = (2 * TP) / ((2 * TP) + FP + FN)
accuracy = (TP + TN)/ (TN + FP + FN + TP)

结论

在上述文章中,只展示数据整理成所需要的Dataframe格式,然后利用Logistic Regression逻辑回归实现分类。最后的结果显示,模型预测能力不高AUC=0.45,所以后续我们需要切换成Random Forest及XGBOOST等算法,进一步提高模型预测准确性。 但是本文还遗留一堆问题:

  • 1.数据的EDA分析(异常值处理,缺失值处理,数据离散化、标准化,单因素分析等)
  • 2.变量筛选
  • 3.模型的参数调节
  • 4.变量的解释

这些问题,请关注本博客,后面会持续推出。。。 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https:/ /cloud.tencent.com/developer/support-plan?invite_code=310xgmuriu2o4

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 乳腺癌预测
  • 1.数据概览
  • 2.数据拆分
  • 3.模型构建
  • 4.模型评估
  • 结论
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档