Day 10 Python Study
·
知识点:
- 异常值的处理---箱线图去除异常值的思想和迭代问题
- 数据集的划分
- 机器学习的流程顺序-----不要数据泄露(归一化器在划分数据集后)
- 机器学习模型建模的三行代码
- 机器学习模型分类问题的评估
- 如何理解分类报告
作业:尝试对心脏病数据集采用机器学习模型建模和评估
import pandas as pd
import pandas as pd #用于数据处理和分析,可处理表格数据。
import numpy as np #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt #用于绘制各种类型的图表
import seaborn as sns #基于matplotlib的高级绘图库,能绘制更美观的统计图形。
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
data = pd.read_csv(r'heart.csv') #读取数据
feature_name_mapping={
'age':'年龄',
'sex':'性别',
'cp':'胸痛类型',
'trestbps':'静息血压',
'chol':'胆固醇',
'fbs':'空腹血糖正常',
'restecg':'静息心电图',
'thalach':'最大心率',
'exang':'运动诱发心绞痛',
'oldpeak':'ST段压低值',
'slope':'ST段斜率',
'ca':'主要血管染色数量',
'thal':'铊负荷实验',
'target':'是否患心脏病'
}
data=data.rename(columns=feature_name_mapping)
data.head(10)
plt.figure(figsize=(8, 6))
sns.boxplot(x=data['静息血压'])
plt.title('静息血压箱线图')
plt.xlabel('静息血压')
plt.show()

column_name = '静息血压'
# 1. 计算 Q1, Q3 和 IQR
Q1 = data[column_name].quantile(0.25)
Q3 = data[column_name].quantile(0.75)
IQR = Q3 - Q1
# 2. 确定异常值边界 (使用 1.5 倍 IQR)
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
print(f"--- '{column_name}' 异常值处理信息 ---")
print(f"Q1 (25th Percentile): {Q1:.2f}")
print(f"Q3 (75th Percentile): {Q3:.2f}")
print(f"IQR (Q3 - Q1): {IQR:.2f}")
print(f"下限 (Lower Bound): {lower_bound:.2f}")
print(f"上限 (Upper Bound): {upper_bound:.2f}")
# 3. 筛选数据:保留在边界内的数据
data_before_drop = len(data)
data_filtered = data[
(data[column_name] >= lower_bound) &
(data[column_name] <= upper_bound)
].copy() # 使用 .copy() 避免 SettingWithCopyWarning
# 4. 更新 DataFrame 并报告结果
data = data_filtered
data_after_drop = len(data)
rows_dropped = data_before_drop - data_after_drop
print(f"\n原始数据行数: {data_before_drop}")
print(f"删除异常值后行数: {data_after_drop}")
print(f"共删除异常值 (行): {rows_dropped}")
# print(f"\nDataFrame 已更新,'{column_name}' 的异常值已被移除。")'
# 1. 计算 Q1, Q3 和 IQR
Q1 = data[column_name].quantile(0.25)
Q3 = data[column_name].quantile(0.75)
IQR = Q3 - Q1
# 2. 确定异常值边界 (使用 1.5 倍 IQR)
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
print(f"--- '{column_name}' 异常值处理信息 ---")
print(f"Q1 (25th Percentile): {Q1:.2f}")
print(f"Q3 (75th Percentile): {Q3:.2f}")
print(f"IQR (Q3 - Q1): {IQR:.2f}")
print(f"下限 (Lower Bound): {lower_bound:.2f}")
print(f"上限 (Upper Bound): {upper_bound:.2f}")
# 3. 筛选数据:保留在边界内的数据
data_before_drop = len(data)
data_filtered = data[
(data[column_name] >= lower_bound) &
(data[column_name] <= upper_bound)
].copy() # 使用 .copy() 避免 SettingWithCopyWarning
# 4. 更新 DataFrame 并报告结果
data = data_filtered
data_after_drop = len(data)
rows_dropped = data_before_drop - data_after_drop
print(f"\n原始数据行数: {data_before_drop}")
print(f"删除异常值后行数: {data_after_drop}")
print(f"共删除异常值 (行): {rows_dropped}")
print(f"\nDataFrame 已更新,'{column_name}' 的异常值已被移除。")
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X = data.drop(['是否患心脏病'], axis=1) # 特征,axis=1表示按列删除
y = data['是否患心脏病'] # 标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 划分数据集,20%作为测试集,随机种子为42
# 训练集和测试集的形状
print(f"训练集形状: {X_train.shape}, 测试集形状: {X_test.shape}") # 打印训练集和测试集的形状
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler,MinMaxScaler
continuous_features=['年龄','静息血压','胆固醇','最大心率','ST段压低值']
scaler=MinMaxScaler()
X_train[continuous_features]=scaler.fit_transform(X_train[continuous_features])
X_test[continuous_features]=scaler.transform(X_test[continuous_features])
X_test
# SVM
svm_model = SVC(random_state=42)
svm_model.fit(X_train, y_train)
svm_pred = svm_model.predict(X_test)
print("\nSVM 分类报告:")
print(classification_report(y_test, svm_pred)) # 打印分类报告
print("SVM 混淆矩阵:")
print(confusion_matrix(y_test, svm_pred)) # 打印混淆矩阵
# 计算 SVM 评估指标,这些指标默认计算正类的性能
svm_accuracy = accuracy_score(y_test, svm_pred)
svm_precision = precision_score(y_test, svm_pred)
svm_recall = recall_score(y_test, svm_pred)
svm_f1 = f1_score(y_test, svm_pred)
print("SVM 模型评估指标:")
print(f"准确率: {svm_accuracy:.4f}")
print(f"精确率: {svm_precision:.4f}")
print(f"召回率: {svm_recall:.4f}")
print(f"F1 值: {svm_f1:.4f}")

# KNN
knn_model=KNeighborsClassifier()
knn_model.fit(X_train,y_train)
knn_pred=knn_model.predict(X_test)
print("\nKNN分类报告")
print(classification_report(y_test,knn_pred))
print("KNN混淆矩阵:")
print(confusion_matrix(y_test,knn_pred))
knn_accuracy=accuracy_score(y_test,knn_pred)
knn_precision=precision_score(y_test,knn_pred)
knn_recall=recall_score(y_test,knn_pred)
knn_f1=f1_score(y_test,knn_pred)
print("KNN 模型评估指标:")
print(f"准确率:{knn_accuracy:.4f}")
print(f"精确率:{knn_precision:.4f}")
print(f"召回率:{knn_recall:.4f}")
print(f"F1值:{knn_f1:.4f}")

# 朴素贝叶斯
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)
nb_pred = nb_model.predict(X_test)
print("\n朴素贝叶斯 分类报告:")
print(classification_report(y_test, nb_pred))
print("朴素贝叶斯 混淆矩阵:")
print(confusion_matrix(y_test, nb_pred))
nb_accuracy = accuracy_score(y_test, nb_pred)
nb_precision = precision_score(y_test, nb_pred)
nb_recall = recall_score(y_test, nb_pred)
nb_f1 = f1_score(y_test, nb_pred)
print("朴素贝叶斯 模型评估指标:")
print(f"准确率: {nb_accuracy:.4f}")
print(f"精确率: {nb_precision:.4f}")
print(f"召回率: {nb_recall:.4f}")
print(f"F1 值: {nb_f1:.4f}")

# XGBoost
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)
xgb_pred = xgb_model.predict(X_test)
print("\nXGBoost 分类报告:")
print(classification_report(y_test, xgb_pred))
print("XGBoost 混淆矩阵:")
print(confusion_matrix(y_test, xgb_pred))
xgb_accuracy = accuracy_score(y_test, xgb_pred)
xgb_precision = precision_score(y_test, xgb_pred)
xgb_recall = recall_score(y_test, xgb_pred)
xgb_f1 = f1_score(y_test, xgb_pred)
print("XGBoost 模型评估指标:")
print(f"准确率: {xgb_accuracy:.4f}")
print(f"精确率: {xgb_precision:.4f}")
print(f"召回率: {xgb_recall:.4f}")
print(f"F1 值: {xgb_f1:.4f}")

更多推荐
所有评论(0)