機器學習實戰——利用Logistic迴歸預測疝氣病症的病馬的死亡率
阿新 • • 發佈:2019-02-17
資料來源
處理過程
由於該資料集存在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()