Anderson

V1

2022/10/24阅读:39主题:橙心

Python机器学习篇-02

写在前面

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

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

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

乳腺癌预测

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

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

1.数据概览

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

## 这里输出模型的预测结果
# 需要将数据整理成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() 

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

## 类似summary
data.describe()
## 查看数据的类型,如字符串还是inter
data.info()
## 查看数据缺失值
data.isnull().sum()

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

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也不需要。

data.drop('Unnamed: 32', axis = 1, inplace = True)

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

2.数据拆分

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

# 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[1]官网的介绍。 sklearn里面介绍了多种算法模型。

from sklearn.linear_model import LogisticRegression
reg = LogisticRegression() # 实例化LM模型
reg.fit(x_train,y_train)   # 用训练集进行训练

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

4.模型评估

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

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.497947980.499795210.499799080.49980748,
       0.499793680.499979680.499798730.499792580.49979763,
       ...
       0.499793480.499795490.499793550.49979398])

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

print(classification_report(y_test,y_pred))
print(confusion_matrix(y_test,y_pred))
print("Training Score: ",reg.score(x_train,y_train)*100)

Roc及95%CI计算。

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

## 返回模型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

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.变量的解释

这些问题,请关注本博客,后面会持续推出。。。

参考资料

[1]

sklearn: https://scikit-learn.org/

[2]

Kaggle: https://www.kaggle.com/code/aryantiwari123/breast-cancer-eda-and-prediction-98/notebook#9.-Naive-Bayes

[3]

ROC曲線置信区间: https://ushitora.net/archives/800

分类:

人工智能

标签:

机器学习

作者介绍

Anderson
V1