乳腺癌数据集是机器学习入门最经典的二分类数据集之一,它包含了569个样本,每个样本有30个特征维度,目标变量标记为恶性(0)和良性(1)。我第一次接触这个数据集时,发现它的特征都是病理学指标,比如细胞核半径、纹理、光滑度等,这些专业名词可能会让新手发怵。不过别担心,sklearn已经帮我们做好了标准化处理,我们只需要关注建模过程。
加载数据只需要一行代码:
python复制from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
但实际项目中我习惯多做一些探索性分析。比如查看特征名称:
python复制print(data.feature_names) # 30个特征名称
print(data.target_names) # ['malignant' 'benign']
数据划分时有个坑我踩过多次:如果不设置random_state参数,每次运行结果都会不同,这对复现结果非常不利。建议这样划分:
python复制from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.3, random_state=42)
逻辑回归虽然名字带"回归",但其实是分类算法。第一次用时我被它的max_iter参数坑过——默认迭代次数可能不够导致警告:
python复制from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(max_iter=10000) # 必须增加迭代次数
lr.fit(X_train, y_train)
评估模型时,新手常犯的错误是只看准确率。我建议至少看这三个指标:
python复制from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = lr.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()
print("查全率:", tp/(tp+fn)) # 恶性样本的识别率
print("查准率:", tp/(tp+fp)) # 恶性预测的可靠度
逻辑回归的关键参数是正则化强度C和惩罚项类型。经过多次实验,我发现这样设置网格效果最好:
python复制from sklearn.model_selection import GridSearchCV
param_grid = {
'C': [0.001, 0.01, 0.1, 1, 10, 100],
'penalty': ['l1', 'l2'],
'solver': ['liblinear'] # 小数据集首选
}
grid = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid.fit(X_train, y_train)
print("最优参数:", grid.best_params_)
KNN对特征尺度极其敏感,记得我第一次忘记标准化时准确率只有60%多。必须这样做:
python复制from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 注意测试集用相同转换
KNN的主要参数中,n_neighbors的选择有讲究。通过实验发现,在乳腺癌数据集上3-5效果较好:
python复制from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, weights='distance')
knn.fit(X_train_scaled, y_train)
距离度量参数p容易被忽视:
我习惯用交叉验证评估模型稳定性,特别是当数据量不大时:
python复制from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X_train_scaled, y_train, cv=10)
print("平均准确率:", scores.mean())
用matplotlib绘制两个模型的K折验证结果对比更直观:
python复制import matplotlib.pyplot as plt
plt.plot(range(2,11), lr_scores, 'r-', label='Logistic Regression')
plt.plot(range(2,11), knn_scores, 'b--', label='KNN')
plt.xlabel('K folds')
plt.ylabel('Accuracy')
plt.legend()
在乳腺癌数据集上,逻辑回归通常表现更稳定,但KNN在参数调优后也能达到相似性能。具体选择哪个模型,还要考虑实际应用场景对计算效率和解释性的要求。