用Python预测HCC患者存活状况

数据来源https://archive.ics.uci.edu/ml/datasets/HCC+Survival
数据集总共只有164个患者数据作为样本,有49个特征,缺失数据占比为10.22%,病人存活用1表示,死亡用0表示。
第一步先读入数据并处理缺失数据,这里缺失数据的处理方法是针对两个不同类别的样本,分别用该类相应特征的平均值替换缺失值。

import numpy as np
import pandas as pd
data2=pd.read_csv('C:/Users/Administrator/Desktop/book1.csv')
data=pd.DataFrame(data2.replace('?',np.nan),dtype=float)
for i in data.columns:
    data1=data.loc[data.iloc[:, 49] == 0, i]
    data3=data.loc[data.iloc[:, 49] == 1, i]
    data1.fillna(data.loc[data.iloc[:,49]==0,i].mean(),inplace=True)
    data3.fillna(data.loc[data.iloc[:,49]==1,i].mean(),inplace=True)
    data.loc[data.iloc[:, 49] == 0, i]=data1
    data.loc[data.iloc[:, 49] == 1, i]=data3#只能这么做,直接对切片用inplace=True无效

在处理缺失值时中发现一个问题:如果直接写出data.loc[data.iloc[:, 49] == 0, i].fillna(data.loc[data.iloc[:,49]==0,i].mean(),inplace=True),结果中的缺失数据并不会被替换掉(why?)。
将数据转化为向量的形式,利用logstic回归分类,作出学习曲线

l=[]
for i in range(164):
    l.append(data.iloc[i,:-1].to_dict())
from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False,dtype=float)
ve=vec.fit_transform(l)
from sklearn.linear_model import LogisticRegression as LR
L=LR()
fig,ax1=plt.subplots(1,1,figsize=(16,9))
N,train_lc,val_lc=learning_curve(L,ve,data.iloc[:,49],train_sizes=np.arange(0.3,1.0,0.1))#train_sizes的上界和下界应在(0,1]之间
ax1.plot(N,np.mean(train_lc,1),color='blue',label="train score")
ax1.plot(N,np.mean(val_lc,1),color='red',label='validation score')
ax1.hlines(np.mean([train_lc[-1],val_lc[-1]]),N[0],N[-1],color='gray',linestyle='dashed')
ax1.set_ylim(0,1)
ax1.set_xlim(N[0],N[-1])
ax1.set_xlabel('training size')
ax1.set_ylabel('score')
ax1.legend(loc='best')
plt.show()

logstic回归的学习曲线
观察学习曲线,虽然曲线还没有完全收敛,但验证得分不足0.8时,训练得分已经降到0.9左右,由此判断模型存在欠拟合。
使用随机森林分类方法,绘制学习曲线和验证曲线

from sklearn.ensemble import RandomForestClassifier
rdc=RandomForestClassifier()
fig,ax=plt.subplots(1,1,figsize=(16,10))
from sklearn.model_selection import learning_curve
N,train_lc,val_lc=learning_curve(rdc,ve,data.iloc[:,49],train_sizes=np.arange(0.1,1.1,0.1))#train_sizes的上界和下界应在(0,1]之间
ax.plot(N,np.mean(train_lc,1),color='blue',label="train score")
ax.plot(N,np.mean(val_lc,1),color='red',label='validation score')
ax.hlines(np.mean([train_lc[-1],val_lc[-1]]),N[0],N[-1],color='gray',linestyle='dashed')
ax.set_ylim(0,1)
ax.set_xlim(N[0],N[-1])
ax.set_xlabel('training size')
ax.set_ylabel('score')
ax.legend(loc='best')
from sklearn.model_selection import validation_curve
train_scole,val_scole=validation_curve(rdc,ve,data.iloc[:,49],param_name="max_features",cv=7,param_range=np.arange(1,50))
import matplotlib.pyplot as plt
degree=np.arange(1,50)
plt.plot(degree,np.median(train_scole,1),color='blue',label='training score')
plt.plot(degree,np.median(val_scole,1),color='red',label='validation score')
plt.legend(loc='best')
plt.ylim(0,1)
plt.xlabel('max features')
plt.ylabel('score')
plt.show()

RF学习曲线
RF验证曲线
第一幅图,随着训练集的增大,模型验证得分超过0.9;从第二幅图看出,训练单个决策树时随机选取12个特征左右,验证得分最高。
使用RF建模,设置max_features=12,用交叉验证法(cv=5)算得模型预测准确率在0.90左右。

model=RandomForestClassifier(max_features=12)
from sklearn.model_selection import cross_val_score
score=cross_val_score(model,ve,data.iloc[:,49],cv=5)
print(score)
print(score.mean())

猜你喜欢

转载自blog.csdn.net/weixin_43614688/article/details/86513212