本文将详细介绍如何对慢性肾病数据集进行完整的分析,主要目标是基于提供的数据预测个体是否会患有慢性肾病。将涵盖以下主题:数据预处理、探索性数据分析、模型构建以及模型保存。让开始吧!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV, train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score
import scipy.stats as stats
import seaborn as sns
现在,让读取数据集:
df = pd.read_csv('kidney.csv')
数据集的形状为:
data.shape
输出结果为:(400, 25),表明数据集包含400个样本和25个特征。
首先,查看数据集的信息:
df.info()
接着,统计每个特征的空值数量:
df.isna().sum()
然后,计算相关性矩阵并进行可视化:
df.corr()
发现类别“ckd”和“notckd”的数量分别为250和150,这表明数据集接近不平衡。
通过条形图来理解目标变量的分布:
df['class'].value_counts().plot(kind='bar', color=['salmon', 'lightblue'], title="肾脏疾病诊断计数")
还检查了年龄列的分布,并绘制了空值的图形。
在这一步,将分类值转换为数值:
data['class'] = data['class'].map({'ckd':1,'notckd':0})
data['htn'] = data['htn'].map({'yes':1,'no':0})
# ... 其他特征的转换
转换后,再次查看相关性矩阵:
plt.figure(figsize = (19,19))sns.heatmap(data.corr(), annot = True, cmap = 'coolwarm')
最后,删除空值,并查看数据集的形状和列名。
使用逻辑回归来构建模型:
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
X = data.iloc[:,:-1]
y = data['class']
X_train, X_test, y_train, y_test = train_test_split(X,y, stratify = y, shuffle = True)
logreg.fit(X_train,y_train)
模型训练得分为1.0,测试准确度为0.975。
还绘制了混淆矩阵,并计算了真阴性、假阳性、假阴性和真阳性的数量。
在不平衡类别的情况下,KNN的表现不佳,因此首先平衡类别:
balanced_df = pd.concat([df[df["class"] == 0], df[df["class"] == 1].sample(n = 115, replace = True)], axis = 0)
balanced_df.reset_index(drop=True, inplace=True)
然后对数据进行标准化,并调整KNN模型以获得更好的准确度:
ss = StandardScaler()
ss.fit(X_train)
X_train = ss.transform(X_train)
X_test = ss.transform(X_test)
使用网格搜索对KNN模型进行调优,并计算准确度和混淆矩阵。
从逻辑回归模型中获取每个特征的系数,以了解每个特征的权重:
feature_dict=dict(zip(df.columns,list(logreg.coef_[0])))
然后可视化特征重要性:
feature_df=pd.DataFrame(feature_dict,index=[0]).T.plot(kind="bar",legend=False,title="特征重要性")
import pickle
saved_model = pickle.dumps(logreg)
logreg_from_pickle = pickle.loads(saved_model)
logreg_from_pickle.predict(X_test)