仁怀市城乡建设网站,企业网站网络营销案例分析,网站编程学,新网站建设ppt背景
前文#xff08;《AI 自学 Lesson1 - Sklearn#xff08;开源Python机器学习包#xff09;》#xff09;以鸢尾花数据集的处理为例#xff0c;本文将完善其代码#xff0c;在使用 sklearn 的部分工具包基础上#xff0c;增加部分数据预处理、数据分析和数据可视化…背景
前文《AI 自学 Lesson1 - Sklearn开源Python机器学习包》以鸢尾花数据集的处理为例本文将完善其代码在使用 sklearn 的部分工具包基础上增加部分数据预处理、数据分析和数据可视化。
由于鸢尾花数据集适用于进行分类和聚类的练习这里使用多种分类和聚类方式并验证其准确性。同时在概念部分对分类和聚类的种类、库、用法等进行补充介绍。
并在文首附上跑通资源便于直接查看处理结果。
一、补充概念
1. 分类
在 sklearn 中常见的分类算法涵盖了从简单的线性模型到复杂的非线性模型。以下是一些常见的分类算法及其对应的库名称
算法名称库名称描述适用场景1逻辑回归Logistic Regressionsklearn.linear_model.LogisticRegression基于逻辑函数的线性分类模型用于二分类或多分类问题。线性可分的二分类或多分类任务。2支持向量机SVMsklearn.svm.SVC, sklearn.svm.LinearSVC高效的分类算法适用于处理高维空间和非线性分类问题。高维数据、复杂的非线性分类任务。3K近邻KNNsklearn.neighbors.KNeighborsClassifier基于距离测量进行分类适用于小型数据集。小数据集、特征空间维度较低的分类任务。4决策树Decision Treesklearn.tree.DecisionTreeClassifier基于树状结构的分类模型能够处理非线性分类任务。非线性数据的分类易于解释和可视化。5随机森林Random Forestsklearn.ensemble.RandomForestClassifier集成多个决策树提升分类的准确性和鲁棒性。处理大规模、高维数据减少过拟合。6朴素贝叶斯Naive Bayessklearn.naive_bayes.GaussianNB, sklearn.naive_bayes.MultinomialNB基于贝叶斯定理的概率分类模型假设特征之间相互独立。文本分类、特征独立的分类任务。7梯度提升树Gradient Boostingsklearn.ensemble.GradientBoostingClassifier通过多个弱分类器的组合逐步提升分类性能适用于复杂数据。非线性、高维数据的复杂分类任务。8极限梯度提升XGBoostxgboost.XGBClassifier高效的梯度提升算法实现适合处理大规模数据性能优异。高性能分类任务常用于竞赛和大数据处理。9多层感知器MLPsklearn.neural_network.MLPClassifier基于神经网络的多层感知器模型能够处理复杂的非线性分类问题。深度学习相关的分类任务非线性数据的分类。 2. 聚类
在 sklearn 中常见的聚类算法涵盖了从基本的距离度量方法到更复杂的层次聚类和密度聚类。以下是常用的聚类算法及其对应的库名称
算法名称库名称描述适用场景1K均值聚类K-Means Clusteringsklearn.cluster.KMeans基于质心的聚类算法通过质心划分数据适用于线性可分数据。线性可分的数据聚类数已知的情况下。2层次聚类Hierarchical Clusteringsklearn.cluster.AgglomerativeClustering通过构建层次树对数据进行聚类能够发现数据的层次结构。需要构建层次结构的聚类任务。3DBSCAN密度聚类sklearn.cluster.DBSCAN基于密度的聚类算法能够发现任意形状的簇适合带噪声数据。发现任意形状的簇处理噪声数据。4均值漂移Mean Shift Clusteringsklearn.cluster.MeanShift基于核密度估计的非参数聚类算法能够自动找到簇的数量。高密度区域的聚类适合未知簇数的情况。5谱聚类Spectral Clusteringsklearn.cluster.SpectralClustering基于图论的聚类算法适合非线性或高维数据。非线性数据或高维空间的聚类任务。6高斯混合模型Gaussian Mixture Model, GMMsklearn.mixture.GaussianMixture基于概率模型的聚类算法假设数据来自多个高斯分布的混合。处理复杂分布的聚类任务适合有重叠的簇。7Birch平衡迭代减少与聚类sklearn.cluster.Birch高效的层次聚类算法适合处理大规模数据集。大规模数据的层次聚类任务。8亲和传播Affinity Propagationsklearn.cluster.AffinityPropagation通过消息传递进行聚类适用于自动确定簇数。自动发现簇数适合不需要预设簇数的聚类任务。9MiniBatch K-Meanssklearn.cluster.MiniBatchKMeansKMeans 的小批量变体适合处理大规模数据。大规模数据集的聚类任务提升计算效率。
在后续代码部分将使用【分类】中的 逻辑回归、k近邻、支持向量机、朴素贝叶斯、决策树 分别对鸢尾花数据集进行处理并判断各模型算法的准确性【聚类】中的 K均值聚类、层次聚类、DBSCAN 分别对鸢尾花数据集进行聚类处理并判断各模型算法的准确性。 3. 交叉验证
交叉验证是用于评估模型泛化能力的技术它通过多次划分数据集来减少偶然性常见的是 K折交叉验证K-Fold Cross-Validation即将数据分成K份每次用其中的一份作为验证集剩下的作为训练集重复K次最后取平均准确率作为模型的性能评估。
通过多次划分数据集减少模型在某一特定训练集上表现过好的风险保证模型在未知数据上的性能稳定。
作用
稳定性通过多次分割数据确保模型在不同数据集上的表现一致。评估泛化能力避免模型过拟合到某一个特定的训练集。综合评估模型性能通过平均和标准差的计算得到模型在多次验证下的表现。 4. F1得分F1 Score
F1得分 是用于分类任务中的一种综合指标它是 精确率Precision 和 召回率Recall 的调和平均数主要用于不平衡数据集即某些类别出现的频率较高另一些类别则较低。 精确率Precision模型预测为正类的样本中真正为正类的比例。召回率Recall真实为正类的样本中模型正确预测为正类的比例。 F1得分的公式为 5. 超参数调优
KNN 的一个关键超参数是 K值近邻个数不同的 K 值会影响模型的性能。为了找到最合适的 K 值我们可以使用 网格搜索Grid Search 结合交叉验证来进行超参数调优。此外还可以调优距离度量方法如 p 值决定使用欧几里得距离或曼哈顿距离等。
通过网格搜索或随机搜索选择最优的超参数组合能够显著提升模型性能避免欠拟合或过拟合。
作用
优化模型性能通过选择合适的超参数可以显著提升模型的表现。避免过拟合调整参数如正则化强度、树的深度等可以防止模型过度拟合训练数据。增强泛化能力经过调优后的模型在未知数据上能有更好的预测能力。
二、代码
1. 准备阶段
#导入内置的鸢尾花数据
from sklearn.datasets import load_iris
import pandas as pd
import numpy as npiris load_iris()
print(iris)#导入所需包
import seaborn as sns #数据可视化
import matplotlib.pyplot as plt #绘图
import pandas as pd #数据分析from sklearn.model_selection import train_test_split #数据划分
from sklearn.preprocessing import StandardScaler #数据标准化from sklearn.linear_model import LogisticRegression #逻辑回归
from sklearn.neighbors import KNeighborsClassifier #K近邻分类
from sklearn.svm import SVC #支持向量机
from sklearn.naive_bayes import GaussianNB #朴素贝叶斯
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.metrics import accuracy_score from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN #聚类库
from sklearn.metrics import adjusted_rand_score, silhouette_score
from sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import cross_val_score #K折交叉验证
from sklearn.model_selection import GridSearchCV #超参数调优-网格搜索#数据集属性描述
print(特征值\n,iris.data)
print(目标值\n,iris[target])
print(特征值名字\n,iris.feature_names)
print(目标值名字\n,iris.target_names)
print(数据集描述\n,iris.DESCR)iris_d pd.DataFrame(datairis.data,columns[sepal length, sepal width, petal length, petal width])iris_d#查看数据类型信息
iris_d.info()
2. 数据可视化
iris_d[target] iris.target#定义函数iris_plot定义三个变量
#使用seaborn进行数据可视化对应函数变量第一位为数据第二位为横轴名第三位为纵轴名
def iris_plot(data,col1,col2):sns.lmplot(xcol1,ycol2,datadata,huetarget,fit_regFalse)plt.show()#显示可视化图表#使用数据为iris_d横轴为名为sepal width,纵轴名为petal length
iris_plot(iris_d,sepal width,petal length)
3. 数据预处理
分为数据划分和数据转换。
#定义数据、标签
X iris.data
y iris.target#进行数据划分
X_train, X_test, y_train, y_test train_test_split(X,y,random_state42#,stratifyy,test_size0.3#,shuffleTrue)
#将完整数据集的70%作为训练集30%作为测试集
#可通过使得设置 stratifyy 测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略)
#可通过设置 shuffleTrue 提前打乱数据print(训练集的目标值形状\n,y_train.shape)
print(测试集的目标值形状\n,y_test.shape)#构建转换器实例
scaler StandardScaler( )#拟合及转换
scaler.fit_transform(X_train)
X_scaled scaler.fit_transform(X)
4. 分类
# 1. 逻辑回归
logistic_model LogisticRegression(max_iter200)
logistic_model.fit(X_train, y_train)
y_pred_logistic logistic_model.predict(X_test)
accuracy_logistic accuracy_score(y_test, y_pred_logistic)
print(f逻辑回归分类准确率: {accuracy_logistic:.2f})# 2. K近邻KNN
knn_model KNeighborsClassifier(n_neighbors5)
knn_model.fit(X_train, y_train)
y_pred_knn knn_model.predict(X_test)
accuracy_knn accuracy_score(y_test, y_pred_knn)
print(fK近邻分类准确率: {accuracy_knn:.2f})# 3. 支持向量机
svm_model SVC()
svm_model.fit(X_train, y_train)
y_pred_svm svm_model.predict(X_test)
accuracy_svm accuracy_score(y_test, y_pred_svm)
print(f支持向量机分类准确率: {accuracy_svm:.2f})# 4. 朴素贝叶斯
nb_model GaussianNB()
nb_model.fit(X_train, y_train)
y_pred_nb nb_model.predict(X_test)
accuracy_nb accuracy_score(y_test, y_pred_nb)
print(f朴素贝叶斯分类准确率: {accuracy_nb:.2f})# 5. 决策树
tree_model DecisionTreeClassifier()
tree_model.fit(X_train, y_train)
y_pred_tree tree_model.predict(X_test)
accuracy_tree accuracy_score(y_test, y_pred_tree)
print(f决策树分类准确率: {accuracy_tree:.2f}) 输出结果 逻辑回归分类准确率: 1.00 K近邻分类准确率: 1.00 支持向量机分类准确率: 1.00 朴素贝叶斯分类准确率: 0.98 决策树分类准确率: 1.00 分析
在鸢尾花数据集上逻辑回归、K近邻、支持向量机 和 决策树 都能达到 100% 的分类准确率这说明这些模型在处理这个简单的三分类问题时表现非常好。朴素贝叶斯 的准确率稍微低一点约为 98%这可能是由于鸢尾花数据集中的特征分布并非完全符合朴素贝叶斯的独立性假设但仍然是一个较好的结果。
5. 聚类
# 1. K均值聚类
kmeans KMeans(n_clusters3, random_state42)
y_pred_kmeans kmeans.fit_predict(X_scaled)
ari_kmeans adjusted_rand_score(y, y_pred_kmeans)
silhouette_kmeans silhouette_score(X_scaled, y_pred_kmeans)
print(fK均值 - Adjusted Rand Index: {ari_kmeans:.2f}, Silhouette Score: {silhouette_kmeans:.2f})# 2. 层次聚类
hierarchical AgglomerativeClustering(n_clusters3)
y_pred_hierarchical hierarchical.fit_predict(X_scaled)
ari_hierarchical adjusted_rand_score(y, y_pred_hierarchical)
silhouette_hierarchical silhouette_score(X_scaled, y_pred_hierarchical)
print(f层次聚类 - Adjusted Rand Index: {ari_hierarchical:.2f}, Silhouette Score: {silhouette_hierarchical:.2f})# 3. DBSCAN
dbscan DBSCAN(eps0.5, min_samples5)
y_pred_dbscan dbscan.fit_predict(X_scaled)
# 由于DBSCAN的标签中可能有-1表示噪声需过滤掉噪声点计算ARI和轮廓系数
ari_dbscan adjusted_rand_score(y, y_pred_dbscan)
if len(set(y_pred_dbscan)) 1: # 如果存在多个簇silhouette_dbscan silhouette_score(X_scaled, y_pred_dbscan)
else:silhouette_dbscan -1 # 如果只有一个簇或噪声
print(fDBSCAN - Adjusted Rand Index: {ari_dbscan:.2f}, Silhouette Score: {silhouette_dbscan:.2f})
代码说明
K均值我们设置簇的数量为3因为鸢尾花数据集包含3类标签并使用 Adjusted Rand Index (ARI) 和 Silhouette Score 来评估聚类效果。层次聚类我们同样设定簇数量为3使用凝聚层次聚类自底向上。DBSCAN使用基于密度的聚类方法不需要指定簇的数量但我们设置 eps0.5min_samples5 来控制聚类的密度参数。该方法对噪声点标记为-1进行自动处理。 输出结果 K均值 - Adjusted Rand Index: 0.62, Silhouette Score: 0.46 层次聚类 - Adjusted Rand Index: 0.62, Silhouette Score: 0.45 DBSCAN - Adjusted Rand Index: 0.44, Silhouette Score: 0.36 分析
K均值聚类 和 层次聚类 在鸢尾花数据集上的表现相似ARI 均为 0.62Silhouette Score 也接近这表明它们能够较好地将数据聚成三类且与真实标签有较高的一致性。DBSCAN 的 ARI 和 Silhouette Score 较低如 0.44 和 0.36这表明它在该数据集上的效果不如前两种算法。由于鸢尾花数据集的分布较为规则DBSCAN 的密度聚类特性并不适合这个数据集。
6. 交叉验证
# 使用准确率作为评估标准
scores cross_val_score(knn_model, X, y, cv5, scoringaccuracy)# 输出交叉验证的平均准确率和标准差
print(fKNN - 交叉验证准确率: {scores.mean():.2f} ± {scores.std():.2f})# 使用加权F1得分作为评估标准
scores cross_val_score(knn_model, X, y, cv5, scoringf1_weighted)# 输出加权F1得分的平均值和标准差
print(fKNN - 加权F1得分: {scores.mean():.2f} ± {scores.std():.2f})
代码说明
scores.mean()计算5次交叉验证的平均准确率。 交叉验证返回的是5次验证的准确率数组scores.mean() 对这些值取平均作为模型在不同划分下的总体表现。均值代表模型的总体准确率水平。scores.std()计算5次交叉验证准确率的标准差。 标准差用于衡量模型准确率的波动程度。标准差越小说明模型在不同数据划分下的表现越稳定反之如果标准差较大表示模型的性能在不同数据集划分上差异较大可能不够稳定。
7. 超参数调优
# 定义需要调优的超参数范围
param_grid {n_neighbors: [3, 5, 7, 9, 11], # K值邻居数weights: [uniform, distance], # 权重p: [1, 2] # p1 曼哈顿距离, p2 欧几里得距离
}# 使用网格搜索与K折交叉验证结合
grid_search GridSearchCV(KNeighborsClassifier(), param_grid, cv5, scoringaccuracy)
grid_search.fit(X, y)# 输出最佳参数和对应的交叉验证得分
print(f最佳超参数组合: {grid_search.best_params_})
print(f最佳交叉验证准确率: {grid_search.best_score_:.2f})
简单来说就是通过字典给超参数不同维度的设置选择使用搜索即是将所有组合的正确率都进行验证并通过 grid_search.best_params_ 返回出最优组合。