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

写在前面

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

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

image.png

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

乳腺癌预测

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

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

1.数据概览

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

image.png
## 这里输出模型的预测结果
# 需要将数据整理成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后添加?,就会有操作提示。

image.png

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

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等指标。

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
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曲線置信区间官网的介绍。

## 返回模型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.变量的解释

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容