1. 程式人生 > >機器學習實戰——利用Logistic迴歸預測疝氣病症的病馬的死亡率

機器學習實戰——利用Logistic迴歸預測疝氣病症的病馬的死亡率

資料來源

處理過程

由於該資料集存在30%的缺失,那麼首先必須對資料集進行預處理,這裡我把缺失值用每列的平均值來代替,同時把資料集沒用的幾列資料捨棄。之後利用sklearn庫進行Logistic迴歸。

結果:
由於有30%的資料缺失,不可避免誤差過大。

Python程式碼如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/4/23 0023 7:59
# @Author  : Aries
# @Site    : 
# @File    : 疝氣症預測病馬死亡率.py
# @Software: PyCharm Community Edition
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression def GetData(path): """ :param path: 資料集路徑 :return: 返回資料集 """ Data = [] Label = [] #沒有用的屬性的下標 index = [2,24,25,26,27] with open(path) as
f: for line in f.readlines(): LineArr = line.strip().split(" ") m = np.shape(LineArr)[0] data = [] for i in range(m): if i in index: #沒有用的屬性直接跳過 continue elif i == 22: #下標為22的屬性是分類
#1代表活著,標記設為1 #2,3分別代表死亡,安樂死,標記設為0 if LineArr[i] == '?': Label.append(0) elif int(LineArr[i]) == 1: Label.append(1) else: Label.append(0) else: #剩下的是有用資料 if LineArr[i] == '?': #缺失資料首先由0代替 data.append(0.0) else: data.append(float(LineArr[i])) Data.append(data) Data = np.array(Data) Label = np.array(Label) return Data,Label def ZeroProcess(data): """ :param data:需要進行0值處理的資料 :return: 返回把0值已經處理好的資料 """ m,n = np.shape(data) for i in range(n): avg = np.average(data[:,i]) if np.any(data[:,i]) == 0: for j in range(m): data[j][i] = avg else: continue return data def autoNorm(Data): """ :param Data: 需要進行歸一化的資料 :return: 進行Max-Min標準化的資料 """ #求出資料中每列的最大值,最小值,以及相應的範圍 data_min = Data.min(0) data_max = Data.max(0) data_range = data_max-data_min #進行歸一化 m = np.shape(Data)[0] Norm_Data = Data - np.tile(data_min,(m,1)) Norm_Data = Norm_Data / data_range return Norm_Data def PreProcess(data): """ 資料預處理,包括0值處理和歸一化 :param data:需要處理的資料 :return: 已經處理好的資料 """ #對資料進行0值處理 Non_Zero_Data = ZeroProcess(data) #對資料進行歸一化 Norm_Data = autoNorm(Non_Zero_Data) return Norm_Data def run_main(): """ 這是主函式 """ #匯入訓練與測試資料集 path1 = "./horse_colic_train.txt" path2 = "./horse_colic_test.txt" Train_Data,Train_Label = GetData(path1) Test_Data,Test_Label = GetData(path2) #資料預處理,包括0值處理和歸一化 Train_Data_Precess = PreProcess(Train_Data) Test_Data_Process = PreProcess(Test_Data) #設定matplotlib,能讓它顯示中文 mpl.rcParams['font.sans-serif'] = [u'simHei'] mpl.rcParams['axes.unicode_minus'] = False #訓練Logistic迴歸演算法 logistiic_regression = LogisticRegression() model = logistiic_regression.fit(Train_Data_Precess,Train_Label) print("Logistic迴歸的係數為:", logistiic_regression.coef_, "常數項為:", logistiic_regression.intercept_) #對Logistic迴歸演算法進行測試 Train_Label_Predict = logistiic_regression.predict(Train_Data_Precess) error = 0.0 for i in range(len(Train_Label)): if Train_Label[i] != Train_Label_Predict[i]: error = error + 1.0 error = error / len(Train_Label) avg = np.average(Train_Label) TSS = np.sum((Train_Label-avg)**2) RSS = np.sum((Train_Label_Predict-Train_Label)**2) R2 = 1 - RSS/TSS print("訓練樣本的誤差為:",error) print("R2為:",R2) #測試新資料 Test_Label_Predict = logistiic_regression.predict(Test_Data_Process) err = 0.0 for i in range(len(Test_Label_Predict)): print(Test_Label[i],Test_Label_Predict[i]) if Test_Label_Predict[i] != Test_Label[i]: err = err + 1.0 err = err / len(Test_Label) print("誤差為:",err) if __name__ == "__main__": run_main()