期末复习别慌!用Python+Scikit-learn手把手复现数据挖掘核心算法(附代码)
期末复习别慌用PythonScikit-learn手把手复现数据挖掘核心算法附代码期末考试临近面对厚厚的数据挖掘教材和密密麻麻的公式你是否感到无从下手别担心本文将带你用Python和Scikit-learn库通过代码实践的方式深入理解数据挖掘的核心算法。我们将从数据预处理开始逐步实现决策树、K-Means聚类和Apriori关联分析等经典算法每个部分都配有可运行的代码示例和关键参数解析。1. 数据预处理实战数据挖掘的第一步永远是数据预处理。好的数据预处理能显著提升后续算法的效果。让我们用Python实现几个关键预处理步骤。首先加载必要的库和经典的Iris数据集import numpy as np import pandas as pd from sklearn import datasets from sklearn.preprocessing import StandardScaler, MinMaxScaler # 加载Iris数据集 iris datasets.load_iris() X iris.data y iris.target1.1 数据标准化与归一化不同特征的量纲差异会影响许多算法的性能如K-Means。我们来看两种常见的缩放方法# 标准化Z-score标准化 scaler StandardScaler() X_standardized scaler.fit_transform(X) # 归一化Min-Max缩放 minmax_scaler MinMaxScaler() X_normalized minmax_scaler.fit_transform(X)标准化 vs 归一化对比表方法公式适用场景Scikit-learn类标准化(x-μ)/σ数据近似正态分布StandardScaler归一化(x-min)/(max-min)数据边界明确MinMaxScaler1.2 特征选择与降维当特征维度很高时我们需要进行特征选择或降维。主成分分析(PCA)是最常用的降维方法之一from sklearn.decomposition import PCA # 保留95%的方差 pca PCA(n_components0.95) X_pca pca.fit_transform(X_standardized) print(f原始维度: {X.shape[1]}) print(f降维后维度: {X_pca.shape[1]}) print(f各主成分解释方差比例: {pca.explained_variance_ratio_})提示PCA前务必先进行标准化否则量纲大的特征会主导主成分方向。2. 决策树算法实现与解析决策树是直观且强大的分类算法让我们用Scikit-learn实现并深入理解其关键参数。2.1 决策树构建from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 创建决策树模型 clf DecisionTreeClassifier( criteriongini, # 也可选entropy max_depth3, min_samples_split2, random_state42 ) # 训练模型 clf.fit(X_train, y_train) # 预测并评估 y_pred clf.predict(X_test) print(f准确率: {accuracy_score(y_test, y_pred):.2f})2.2 决策树可视化与解释理解决策树的关键是查看其分裂过程from sklearn.tree import plot_tree import matplotlib.pyplot as plt plt.figure(figsize(12,8)) plot_tree(clf, feature_namesiris.feature_names, class_namesiris.target_names, filledTrue) plt.show()决策树可视化会显示每个节点的分裂特征和阈值当前节点的基尼不纯度或熵值样本分布情况最终的类别预测常见问题排查如果准确率过低尝试调整max_depth避免欠拟合如果训练集表现好但测试集差可能是过拟合尝试设置min_samples_split或min_samples_leaf类别不平衡时设置class_weightbalanced3. K-Means聚类实战K-Means是最常用的聚类算法之一让我们实现并分析其关键参数。3.1 基础K-Means实现from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 使用标准化后的数据 kmeans KMeans( n_clusters3, initk-means, n_init10, max_iter300, random_state42 ) clusters kmeans.fit_predict(X_standardized) # 评估聚类效果 print(f轮廓系数: {silhouette_score(X_standardized, clusters):.2f}) print(f簇中心:\n{kmeans.cluster_centers_})3.2 确定最佳K值K-Means需要预先指定簇数量K如何确定最佳K值# 肘部法则 inertia [] for k in range(1, 8): kmeans KMeans(n_clustersk, random_state42).fit(X_standardized) inertia.append(kmeans.inertia_) plt.plot(range(1, 8), inertia, markero) plt.xlabel(Number of clusters) plt.ylabel(Inertia) plt.title(Elbow Method) plt.show()K-Means关键参数解析参数说明调优建议n_clusters簇数量K使用肘部法则或轮廓系数确定init初始化方法k-means通常优于随机初始化n_init不同初始化的运行次数值越大结果越稳定但计算成本越高max_iter单次运行最大迭代次数通常300足够注意K-Means对初始质心敏感对非球形簇效果不佳且需要数据尺度一致务必先标准化。4. Apriori关联分析实现虽然Scikit-learn没有直接实现Apriori算法但我们可以使用mlxtend库来实现购物篮分析。4.1 准备交易数据首先模拟一个购物篮数据集import pandas as pd from mlxtend.preprocessing import TransactionEncoder dataset [[牛奶, 面包, 尿布], [可乐, 面包, 尿布, 啤酒], [牛奶, 尿布, 啤酒, 鸡蛋], [面包, 牛奶, 尿布, 啤酒], [面包, 牛奶, 尿布, 可乐]] te TransactionEncoder() te_ary te.fit(dataset).transform(dataset) df pd.DataFrame(te_ary, columnste.columns_)4.2 频繁项集挖掘与关联规则from mlxtend.frequent_patterns import apriori, association_rules # 挖掘频繁项集最小支持度0.6 frequent_itemsets apriori(df, min_support0.6, use_colnamesTrue) # 生成关联规则最小置信度0.7 rules association_rules(frequent_itemsets, metricconfidence, min_threshold0.7) # 按提升度排序 rules.sort_values(lift, ascendingFalse, inplaceTrue) print(rules[[antecedents, consequents, support, confidence, lift]])关联规则指标解释支持度(Support): 项集出现的频率置信度(Confidence): 规则A→B的可靠性提升度(Lift): 规则的实际效果与随机情况的比值4.3 关联分析可视化import networkx as nx import matplotlib.pyplot as plt # 创建有向图 G nx.DiGraph() for _, row in rules.iterrows(): G.add_edge(, .join(row[antecedents]), , .join(row[consequents]), weightrow[lift]) # 绘制图形 plt.figure(figsize(10,6)) pos nx.spring_layout(G, k0.5) nx.draw(G, pos, with_labelsTrue, node_colorskyblue, edge_colorgray, width[d[weight]*0.5 for (u,v,d) in G.edges(dataTrue)], font_size10) plt.title(关联规则网络 (边宽度表示提升度)) plt.show()5. 算法对比与选择指南在实际应用中如何选择合适的算法以下是几个关键考量因素算法选择对照表问题类型适用算法Scikit-learn类关键参数分类问题决策树DecisionTreeClassifiermax_depth, criterion聚类问题K-MeansKMeansn_clusters, init关联规则Apriori(mlxtend)min_support, min_confidence回归问题随机森林RandomForestRegressorn_estimators, max_depth性能优化技巧对于大型数据集考虑使用MiniBatchKMeans替代标准K-Means决策树可以组合成随机森林(RandomForest)提升性能关联分析中适当提高支持度阈值可以减少计算量在实际项目中我通常会先尝试简单模型作为基线再逐步尝试更复杂的算法。例如分类问题可以先从决策树开始如果效果不佳再尝试随机森林或梯度提升树(如XGBoost)。