機器學習入門04——糖尿病數據預測

利用Logistic迴歸技術實現糖尿病發病預測

數據說明

數據說明: Pima Indians Diabetes Data Set(皮馬印第安人糖尿病數據集) 根據現有的醫療信息預測5年內皮馬印第安人糖尿病發作的概率。
數據鏈接:https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes
p.s.: Kaggle也有一個Practice Fusion Diabetes Classification任務,可以試試:)
https://www.kaggle.com/c/pf2012-diabetes

1)文件說明

pima-indians-diabetes.csv:數據文件

2)字段說明

數據集共9個字段:
pregnants:懷孕次數
Plasma_glucose_concentration:口服葡萄糖耐量試驗中2小時後的血漿葡萄糖濃度
blood_pressure:舒張壓,單位:mm Hg
Triceps_skin_fold_thickness:三頭肌皮褶厚度,單位:mm
serum_insulin:餐後血清胰島素,單位:mm
BMI:體重指數(體重(公斤)/ 身高(米)^2)
Diabetes_pedigree_function:糖尿病家系作用
Age:年齡
Target:標籤, 0表示不發病,1表示發病

第一步 特徵工程

對於原始數據的處理使用了一下幾個方法:

  • 使用中值補充缺失數據
  • 使用StandardScaler()對數據進行標準化處理
  • 保存爲csv格式
import numpy as np
import pandas as pd
#input data
train = pd.read_csv("pima-indians-diabetes.csv")
print(train.head())

#查看缺失值較多的數據統計
NaN_col_names = ['Plasma_glucose_concentration','blood_pressure','Triceps_skin_fold_thickness','serum_insulin','BMI']
train[NaN_col_names] = train[NaN_col_names].replace(0, np.NaN)
print(train.isnull().sum())


#中值補充確實值
medians = train.median() 
train = train.fillna(medians)

print(train.isnull().sum())


#  get labels
y_train = train['Target']   
X_train = train.drop(["Target"], axis=1)

#用於保存特徵工程之後的結果
feat_names = X_train.columns

# 數據標準化
from sklearn.preprocessing import StandardScaler

# 初始化特徵的標準化器
ss_X = StandardScaler()

# 分別對訓練和測試數據的特徵進行標準化處理
X_train = ss_X.fit_transform(X_train)

#存爲csv格式
X_train = pd.DataFrame(columns = feat_names, data = X_train)

train = pd.concat([X_train, y_train], axis = 1)

train.to_csv('FE_pima-indians-diabetes.csv',index = False,header=True)

print(train.head())

第二步 訓練模型

訓練模型主要分爲以下幾個步驟:

  • 導入數據
  • 分別使用L1正則和L2正則訓練模型
  • 使用5折交叉驗證
  • 使用log似然損失和正確率對模型進行超參數調優
  • 繪製CV誤差曲線
# 首先 import 必要的模塊
import pandas as pd 
import numpy as np

from sklearn.model_selection import GridSearchCV

import matplotlib.pyplot as plt

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
#%matplotlib inline


# 讀取數據

train = pd.read_csv('FE_pima-indians-diabetes.csv')

y_train = train['Target']   
X_train = train.drop(["Target"], axis=1)

#保存特徵名字以備後用(可視化)
feat_names = X_train.columns 

#需要調優的參數
# 請嘗試將L1正則和L2正則分開,並配合合適的優化求解算法(slover)
penaltys = ['l1','l2']

#訓練數據多,C可以大一點(更多相信數據)
Cs = [0.01, 0.1, 1, 10, 100, 1000, 10000]

tuned_parameters = dict(penalty = penaltys, C = Cs)#組合調優參數

lr_penalty= LogisticRegression()
#grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')#log似然損失
grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='accuracy')#正確率
grid.fit(X_train,y_train)

# examine the best model
print(-grid.best_score_)#打印模型參數
print(grid.best_params_)


#繪製CV誤差曲線分析模型
# plot CV誤差曲線
test_means = grid.cv_results_[ 'mean_test_score' ]
test_stds = grid.cv_results_[ 'std_test_score' ]
train_means = grid.cv_results_[ 'mean_train_score' ]
train_stds = grid.cv_results_[ 'std_train_score' ]


# plot results
n_Cs = len(Cs)
number_penaltys = len(penaltys)
test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)
train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)
test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)
train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)

x_axis = np.log10(Cs)
for i, value in enumerate(penaltys):
    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))
    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')
    #plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')
    
plt.legend()
plt.xlabel( 'log(C)' )                                                                                                      
plt.ylabel( 'logloss' )
plt.savefig('LogisticGridSearchCV_C.png' )

plt.show()

import cPickle

cPickle.dump(grid.best_estimator_, open("FE_pima-indians-diabetes", 'wb'))


使用log似然損失對Logistic迴歸模型的正則超參數調優

參數結果:

0.47602775434873434
{'C': 1, 'penalty': 'l1'}

輸入圖片說明

使用log似然損失對Logistic迴歸模型的正則超參數調優

參數結果:

-0.7747395833333334
{'C': 0.1, 'penalty': 'l2'}

輸入圖片說明

可以看到,使用正確率和l2正則對Logistic迴歸模型的正則超參數調優可以使損失函數最小

GridSearchCV()中scoring的值可以選用一下參數:

輸入圖片說明

點擊這裏可以到官網查看!!!

項目源代碼:糖尿病發病率預測

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章