本文通过多个典型案例,系统讲解机器学习中的分类与聚类技术实现,涵盖数据预处理、模型训练、评估优化等关键环节,并附可复现的Python代码。
一、分类任务实战
1.1 数据准备与划分
# 正确加载方式
from sklearn.model_selection import train_test_split
import pandas as pd
data = pd.read_csv("1.csv")
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 规范变量命名
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42)
1.2 核心分类算法实现
K近邻算法(KNN)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
# 修正后的KNN实现
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 交叉验证正确用法
cv_scores = cross_val_score(knn, X_train, y_train, cv=5)
print(f"KNN交叉验证准确率:{cv_scores.mean():.2f} (±{cv_scores.std():.2f})")
朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
# 修正贝叶斯实现
nb_clf = GaussianNB()
nb_clf.fit(X_train, y_train)
# 验证集评估
test_acc = nb_clf.score(X_test, y_test)
print(f"贝叶斯测试准确率:{test_acc:.2%}")
1.3 模型评估要点
- 混淆矩阵可视化
- 分类报告输出
- 交叉验证策略选择
- 多模型对比分析
二、聚类实例解析(K-Means迭代过程)
2.1 初始条件
- 样本集S坐标:
O1(0,2) O2(0,0) O3(1.5,0) O4(5,0) O5(5,2)
- 初始簇中心:
M1 = (0,2) # O1坐标 M2 = (0,0) # O2坐标
2.2 样本分配计算(以O3为例)
<过程详解>
-
计算欧氏距离:
d(M1,O3)d(M2,O3)=(0−1.5)2+(2−0)2=2.25+4=2.5=(0−1.5)2+(0−0)2=2.25=1.5 -
距离比较:
1.5 (M2) < 2.5 (M1) ⇒ O3 ∈ C2
-
分配结果:
C1 = {O1} C2 = {O2, O3}
2.3 簇中心更新
M1′=(20+5,22+2)=(2.5,2)M2′=(30+1.5+5,30+0+0)=(2.17,0)
2.4 二次迭代分配
样本点 | 到M1'(2.5,2)距离 | 到M2'(2.17,0)距离 | 归属簇 |
---|---|---|---|
O1(0,2) | √(2.5²+0²)=2.5 | √(2.17²+2²)=3.02 | C1 |
O5(5,2) | √(2.5²+0²)=2.5 | √(2.83²+2²)=3.47 | C1 |
O2(0,0) | √(2.5²+2²)=3.2 | √(2.17²+0²)=2.17 | C2 |
O4(5,0) | √(2.5²+2²)=3.2 | √(2.83²+0²)=2.83 | C2 |
最终聚类结果:
C1 = {O1, O5} 中心(2.5,2)
C2 = {O2, O3, O4} 中心(2.17,0)
2.5 误差计算验证
SSE1SSE2Total SSE=(0−2.5)2+(5−2.5)2=12.5=(0−2.17)2+(1.5−2.17)2+(5−2.17)2=13.15=12.5+13.15=25.65(较初始52.25下降51)
三、机器学习最佳实践
3.1 模型选择建议
算法类型 | 适用场景 | 时间复杂度 | 数据要求 |
---|---|---|---|
KNN | 小规模数据 | O(n) | 需要归一化 |
朴素贝叶斯 | 文本分类 | O(n) | 特征独立 |
K-Means | 客户分群 | O(nkt) | 球形分布 |
3.2 性能优化策略
- 特征工程:增加名字性别特征、文本关键词特征
- 参数调优:GridSearchCV自动搜索
- 集成方法:VotingClassifier组合模型
四、最佳实践建议
-
分类任务优化:使用GridSearchCV自动选择KNN最优
from sklearn.model_selection import GridSearchCV param_grid = {'n_neighbors': range(1, 15)} grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5) grid.fit(X_train, y_train)
-
聚类改进方案:采用K-Means++初始化避免局部最优
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=2, init='k-means++', n_init=10)
-
可视化验证:
import matplotlib.pyplot as plt plt.scatter(X[:,0], X[:,1], c=clusters) plt.scatter(centers[:,0], centers[:,1], marker='X', s=200) plt.show()