機器學習專案---預測心臟病(一)

cottpaddedC發表於2020-12-01

使用機器學習預測心臟病

問題定義

給定有關患者的臨床引數,我們能否預測他們是否患有心臟病,
檢視您是否可以在心臟資料中找到其他趨勢來預測某些心血管事件或找到心臟健康的任何明確跡象

特徵

#匯入相關的庫
mport pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

%matplotlib inline
sns.set_style("whitegrid")
plt.style.use("fivethirtyeight")

載入資料

df = pd.read_csv("./data/heart.csv")
df.head()

在這裡插入圖片描述
1、age - age in years
2、sex -(1 =男性; 0 =女性)
3、cp - -胸痛型別(0: 典型的心絞痛:與胸痛有關,減少心臟的血液供應1: 非心絞痛:通常為食道痙攣(與心臟無關)2: 非心絞痛:通常為食道痙攣(與心臟無關)3: 無症狀:胸痛未顯示疾病跡象)
4、trestbps - 靜息血壓(入院時以毫米汞柱為單位)高於130-140的情況通常令人擔憂
5、chol - 血清膽汁,mg / dl
血清= LDL + HDL + 0.2 *甘油三酸酯
200以上值得關注
6、fbs-(空腹血糖> 120 mg / dl)(1 =正確; 0 =錯誤)
'> 126’mg / dL表示糖尿病
7、restecg --靜息心電圖結果
0:沒什麼可注意的
1:ST-T波異常
範圍從輕度症狀到嚴重問題
表示心跳不正常
2:可能或確定的左心室肥大
擴大心臟的主泵室
8、丘腦-達到最大心率
9、exang - 運動誘發的心絞痛(1 =是; 0 =否)
10、oldpeak - 運動引起的相對於休息的ST抑鬱會在運動不健康的心臟時觀察心臟的壓力,這會增加壓力
11、slope - 最高運動ST段的坡度
0: Upsloping: 鍛鍊可提高心率(罕見)
1: Flatsloping: 變化很小(典型的健康心臟)
2: Downslopins:心臟不健康的體徵
12、ca - 螢光顯色的主要血管數目(0-3)
彩色血管意味著醫生可以看到血液通過
血液運動越多越好(無凝塊)
13、thal - al-lium應力結果
1,3:正常
6: 修復缺陷:曾經是缺陷,但是現在可以了
7: 可逆缺陷:鍛鍊時沒有適當的血液運動
14、target - 是否患有疾病(1 =是,0 =否)(=預測屬性)

df.info()

在這裡插入圖片描述

pd.set_option("display.float","{:.2f}".format)
df.target.value_counts()
df.target.value_counts().plot(kind="bar", color=["salmon", "lightblue"])

在這裡插入圖片描述

探索性資料分析(EDA)

這裡的目標是查詢有關資料的更多資訊,併成為您正在使用的資料集上的主題匯出。
您要解決什麼問題?
我們擁有什麼樣的資料,以及如何處理不同型別的資料?
資料中缺少什麼以及如何處理?
異常值在哪裡,為什麼要關心它們?
您如何新增,更改或刪除功能以從資料中獲取更多資訊?

#Checking for messing values
df.isna().sum()

在這裡插入圖片描述

categorical_val = []
continous_val = []
for column in df.columns:
    print('==============================')
    print(f"{column} : {df[column].unique()}")
    if len(df[column].unique()) <= 10:
        categorical_val.append(column)
    else:
        continous_val.append(column)

在這裡插入圖片描述

plt.figure(figsize=(15, 15))

for i, column in enumerate(categorical_val, 1):
    plt.subplot(3, 3, i)
    df[df["target"] == 0][column].hist(bins=35, color='blue', label='Have Heart Disease = NO', alpha=0.6)
    df[df["target"] == 1][column].hist(bins=35, color='red', label='Have Heart Disease = YES', alpha=0.6)
    plt.legend()
    plt.xlabel(column)

在這裡插入圖片描述

cp {胸痛}:cp等於1、2、3的人比cp等於0的人患心臟病的可能性更高。

restecg {靜息心電圖結果}:值為1的人(訊號非正常心跳,範圍從輕度症狀到嚴重問題)更可能患有心臟病。

exang {運動誘發的心絞痛}:值0(否==>運動誘發心絞痛)的人患心臟病的人數多於值1(是==>運動誘發心絞痛)的人。

坡度{最高運動ST段的坡度}:坡度值等於2的人(下坡:心臟不健康的徵兆)比坡度值等於0的人更容易患心臟病(坡度:鍛鍊時心率更高) )或1(平底鞋:變化很小(典型的健康心臟))。

ca {浮雕著色的主要血管數量(0-3)}:血液運動越多越好,因此ca等於0的人更容易患心臟病。

thal {tha應力結果}:thal值等於2(固定缺陷:曾經是缺陷,但現在可以)的人更容易患心臟病。

plt.figure(figsize=(15, 15))

for i, column in enumerate(continous_val, 1):
    plt.subplot(3, 2, i)
    df[df["target"] == 0][column].hist(bins=35, color='blue', label='Have Heart Disease = NO', alpha=0.6)
    df[df["target"] == 1][column].hist(bins=35, color='red', label='Have Heart Disease = YES', alpha=0.6)
    plt.legend()
    plt.xlabel(column)

在這裡插入圖片描述

trestbps:靜息血壓(入院時以毫米汞柱為單位)高於130-140的任何數值通常令人擔憂

chol {血清膽甾醇,單位mg / dl}:超過200值得關注。

thalach {達到的最大心率}:達到最大心率超過140的人更容易患心臟病。

運動相對於休息引起的oldpeak ST抑鬱症在鍛鍊過程中著眼於心臟壓力,不健康的心臟會增加壓力

# Create another figure
plt.figure(figsize=(10, 8))

# Scatter with postivie examples
plt.scatter(df.age[df.target==1],
            df.thalach[df.target==1],
            c="salmon")

# Scatter with negative examples
plt.scatter(df.age[df.target==0],
            df.thalach[df.target==0],
            c="lightblue")

# Add some helpful info
plt.title("Heart Disease in function of Age and Max Heart Rate")
plt.xlabel("Age")
plt.ylabel("Max Heart Rate")
plt.legend(["Disease", "No Disease"]);

在這裡插入圖片描述

# Let's make our correlation matrix a little prettier
corr_matrix = df.corr()
fig, ax = plt.subplots(figsize=(15, 15))
ax = sns.heatmap(corr_matrix,
                 annot=True,
                 linewidths=0.5,
                 fmt=".2f",
                 cmap="YlGnBu");
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)

在這裡插入圖片描述

df.drop('target', axis=1).corrwith(df.target).plot(kind='bar', grid=True, figsize=(12, 8), 
                                                   title="Correlation with target")

在這裡插入圖片描述
fbs和chol與目標變數的相關性最低。

所有其他變數與目標變數具有顯著的相關性。

categorical_val.remove('target')
dataset = pd.get_dummies(df, columns = categorical_val)
dataset.head()

在這裡插入圖片描述
在這裡插入圖片描述

from sklearn.preprocessing import StandardScaler

s_sc = StandardScaler()
col_to_scale = ['age', 'trestbps', 'chol', 'thalach', 'oldpeak']
dataset[col_to_scale] = s_sc.fit_transform(dataset[col_to_scale])
dataset.head()

在這裡插入圖片描述

相關文章