数据集介绍
我们将使用一个来自UCI机器学习库的乳腺癌数据集。这个数据集包含了乳腺癌肿瘤的一些特征信息,以及对肿瘤的诊断结果。数据集的特征包括肿瘤的尺寸、质地、周长等等。我们的目标是根据这些特征来预测肿瘤是良性还是恶性。
首先,我们需要加载所需的库和数据集:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_curve, roc_auc_score
# 加载数据集
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data"
columns = [
"ID number",
"Diagnosis",
"Mean Radius",
"Mean Texture",
"Mean Perimeter",
"Mean Area",
"Mean Smoothness",
"Mean Compactness",
"Mean Concavity",
"Mean Concave Points",
"Mean Symmetry",
"Mean Fractal Dimension",
"Radius SE",
"Texture SE",
"Perimeter SE",
"Area SE",
"Smoothness SE",
"Compactness SE",
"Concavity SE",
"Concave Points SE",
"Symmetry SE",
"Fractal Dimension SE",
"Worst Radius",
"Worst Texture",
"Worst Perimeter",
"Worst Area",
"Worst Smoothness",
"Worst Compactness",
"Worst Concavity",
"Worst Concave Points",
"Worst Symmetry",
"Worst Fractal Dimension"
]
data = pd.read_csv(url, names=columns)
# 处理缺失值
data = data.replace(to_replace="?", value=np.nan)
data.dropna(inplace=True)
# 划分数据集
X = data.iloc[:, 2:]
y = data["Diagnosis"]
X_train, X_test, y_train, y_test = train_test_split(X, y)
# 标准化
std = StandardScaler()
X_train = std.fit_transform(X_train)
X_test = std.transform(X_test)
构建逻辑回归模型
现在,我们可以构建逻辑回归模型并对其进行训练:
# 逻辑回归
lr = LogisticRegression()
lr.fit(X_train, y_train)
模型评估与性能指标
接下来,我们可以使用训练好的模型对测试数据进行预测,并计算模型的性能指标:
# 模型评估
y_predict = lr.predict(X_test)
score = lr.score(X_test, y_test)
# 精确率、召回率、F1-score
report = classification_report(y_test, y_predict, labels=["M", "B"], target_names=["恶性", "良性"])
# ROC曲线
y_predict_proba = lr.predict_proba(X_test)
y_predict_proba = y_predict_proba[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, y_predict_proba, pos_label="M")
# AUC
auc = roc_auc_score(y_test, y_predict_proba)
结果可视化
最后,我们可以使用Matplotlib库绘制ROC曲线和展示模型的性能指标:
# 绘制ROC曲线
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
# 输出性能指标
print("准确率:", score)
print("分类报告:\n", report)
print("AUC:", auc)