版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器学习:K-近邻算法(KNN):KNN算法的Python实现1机器学习:K-近邻算法(KNN):KNN算法的Python实现1.1简介和原理1.1.1KNN算法的基本概念K-近邻算法(K-NearestNeighbors,KNN)是一种基于实例的学习方法,用于分类和回归。在分类问题中,KNN通过计算待分类样本与训练集中所有样本的距离,找出距离最近的K个样本,然后根据这K个样本的类别来预测待分类样本的类别。对于回归问题,KNN则通过计算距离最近的K个样本的平均值或加权平均值来预测待预测样本的值。1.1.2KNN算法的工作原理计算距离:KNN算法首先计算待分类样本与训练集中每个样本之间的距离。常用的距离计算方法有欧氏距离、曼哈顿距离和闵可夫斯基距离等。选择最近的K个样本:从计算出的距离中,选择距离最小的K个样本。类别决策:对于分类问题,统计这K个样本中各个类别的出现频率,将出现频率最高的类别作为待分类样本的预测类别。对于回归问题,计算这K个样本的平均值或加权平均值作为预测值。1.1.3KNN算法的优缺点优点:-算法简单,易于理解和实现。-无需训练模型,适用于动态数据集。-对异常值不敏感。缺点:-计算量大,尤其是当数据集很大时。-对于高维数据,距离计算可能变得不准确。-需要选择合适的K值,K值的选择对结果有较大影响。1.2Python实现1.2.1示例:使用KNN进行分类假设我们有一个简单的数据集,包含两个特征和两个类别:#导入必要的库
importnumpyasnp
fromcollectionsimportCounter
fromsklearn.datasetsimportmake_classification
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.metricsimportaccuracy_score
#生成数据集
X,y=make_classification(n_samples=100,n_features=2,n_redundant=0,n_informative=2,
n_clusters_per_class=1,random_state=4)
#划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=4)
#定义KNN分类器
classKNNClassifier:
def__init__(self,k=3):
self.k=k
deffit(self,X,y):
self.X_train=X
self.y_train=y
defpredict(self,X):
y_pred=[self._predict(x)forxinX]
returnnp.array(y_pred)
def_predict(self,x):
#计算距离
distances=[np.sqrt(np.sum((x_train-x)**2))forx_traininself.X_train]
#获取最近的K个样本的索引
k_indices=np.argsort(distances)[:self.k]
#获取最近的K个样本的类别
k_nearest_labels=[self.y_train[i]foriink_indices]
#统计类别频率
most_common=Counter(k_nearest_labels).most_common(1)
#返回预测类别
returnmost_common[0][0]
#实例化KNN分类器
knn=KNNClassifier(k=3)
#训练模型
knn.fit(X_train,y_train)
#预测测试集
y_pred=knn.predict(X_test)
#计算准确率
accuracy=accuracy_score(y_test,y_pred)
print(f'Accuracy:{accuracy}')1.2.2示例解释数据生成:使用make_classification函数生成一个包含100个样本,2个特征,2个类别的数据集。数据划分:使用train_test_split函数将数据集划分为训练集和测试集。KNN分类器定义:定义一个KNN分类器类,包含初始化、拟合和预测方法。在预测方法中,计算每个测试样本与训练样本之间的距离,选择距离最近的K个样本,然后根据这些样本的类别来预测测试样本的类别。模型训练和预测:实例化KNN分类器,使用训练数据进行拟合,然后对测试数据进行预测。性能评估:使用accuracy_score函数计算预测准确率。通过这个例子,我们可以看到KNN算法在Python中的实现过程,以及如何使用它进行分类预测。2数据预处理数据预处理是机器学习项目中至关重要的一步,它直接影响模型的性能和预测的准确性。在本教程中,我们将深入探讨数据预处理的三个关键方面:数据清洗、数据标准化和数据集划分,并通过Python代码示例来说明每个步骤。2.1数据清洗数据清洗涉及识别和纠正数据集中的错误和不一致性。这可能包括处理缺失值、删除重复记录、修正数据格式等。2.1.1示例:处理缺失值假设我们有一个包含用户年龄和收入的数据集,其中一些记录的年龄字段缺失。importpandasaspd
importnumpyasnp
#创建一个包含缺失值的示例数据集
data={'Age':[32,np.nan,24,28,np.nan,35,29],
'Income':[50000,60000,45000,55000,65000,70000,48000]}
df=pd.DataFrame(data)
#使用平均年龄填充缺失值
mean_age=df['Age'].mean()
df['Age'].fillna(mean_age,inplace=True)
#打印处理后的数据集
print(df)2.1.2示例:删除重复记录数据集中可能包含重复的记录,这会影响模型的训练。下面的代码示例展示了如何识别并删除重复记录。#创建一个包含重复记录的示例数据集
data={'Name':['Alice','Bob','Charlie','Alice','Bob'],
'Age':[25,30,35,25,30],
'Income':[50000,60000,70000,50000,60000]}
df=pd.DataFrame(data)
#删除重复记录
df.drop_duplicates(inplace=True)
#打印处理后的数据集
print(df)2.2数据标准化数据标准化(或归一化)是将数据转换为统一尺度的过程,这对于许多机器学习算法(如KNN)是必要的,因为它们依赖于距离度量。2.2.1示例:使用Z-score标准化Z-score标准化是一种常见的数据标准化方法,它将数据转换为均值为0,标准差为1的分布。fromsklearn.preprocessingimportStandardScaler
#创建示例数据集
data={'Height':[160,165,170,175,180],
'Weight':[50,55,60,65,70]}
df=pd.DataFrame(data)
#创建StandardScaler对象
scaler=StandardScaler()
#对数据集进行标准化
df_scaled=scaler.fit_transform(df)
#将标准化后的数据转换为DataFrame
df_scaled=pd.DataFrame(df_scaled,columns=df.columns)
#打印标准化后的数据集
print(df_scaled)2.3数据集划分将数据集划分为训练集和测试集是评估模型性能的标准做法。这有助于我们了解模型在未见过的数据上的表现。2.3.1示例:使用Scikit-learn划分数据集Scikit-learn库提供了方便的函数来划分数据集。fromsklearn.model_selectionimporttrain_test_split
#创建示例数据集和目标变量
data={'Height':[160,165,170,175,180],
'Weight':[50,55,60,65,70]}
target=[0,1,0,1,0]
df=pd.DataFrame(data)
#划分数据集
X_train,X_test,y_train,y_test=train_test_split(df,target,test_size=0.2,random_state=42)
#打印训练集和测试集的大小
print("Trainingsetsize:",X_train.shape)
print("Testingsetsize:",X_test.shape)通过以上步骤,我们确保了数据的清洁、一致性和模型评估的准确性,为后续的机器学习模型训练奠定了坚实的基础。3机器学习:K-近邻算法(KNN):KNN算法的Python实现3.1导入必要的库在开始实现KNN算法之前,我们需要导入一些Python库,这些库将帮助我们处理数据和构建模型。#导入必要的库
importnumpyasnp
fromsklearnimportdatasets
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.preprocessingimportStandardScaler
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportaccuracy_score,classification_report,confusion_matrix3.2创建数据集我们将使用sklearn库中的iris数据集作为示例。这个数据集包含了150个样本,每个样本有4个特征,分别代表鸢尾花的萼片长度、萼片宽度、花瓣长度和花瓣宽度,以及它们的分类标签。#加载数据集
iris=datasets.load_iris()
X=iris.data
y=iris.target
#划分数据集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)3.3计算距离的函数KNN算法的核心是计算距离。这里我们实现一个简单的函数来计算两个样本之间的欧氏距离。defeuclidean_distance(x1,x2):
"""
计算两个样本之间的欧氏距离。
:paramx1:第一个样本
:paramx2:第二个样本
:return:欧氏距离
"""
returnnp.sqrt(np.sum((x1-x2)**2))3.4找到最近的邻居接下来,我们需要一个函数来找到测试样本的最近邻居。这通常涉及到计算测试样本与所有训练样本之间的距离,然后选择距离最近的K个样本。deffind_nearest_neighbors(X_train,y_train,X_test,k=3):
"""
找到测试样本的最近邻居。
:paramX_train:训练样本特征
:paramy_train:训练样本标签
:paramX_test:测试样本特征
:paramk:邻居数量
:return:最近邻居的标签
"""
distances=[]
foriinrange(len(X_train)):
#计算距离
d=euclidean_distance(X_test,X_train[i])
#存储距离和对应的标签
distances.append((d,y_train[i]))
#对距离进行排序
distances.sort(key=lambdax:x[0])
#获取最近的k个邻居的标签
neighbors=np.array([distances[i][1]foriinrange(k)])
returnneighbors3.5预测分类有了最近邻居的标签,我们可以预测测试样本的分类。这通常通过投票机制完成,即选择出现次数最多的邻居标签作为预测结果。defpredict_classification(X_train,y_train,X_test,k=3):
"""
预测测试样本的分类。
:paramX_train:训练样本特征
:paramy_train:训练样本标签
:paramX_test:测试样本特征
:paramk:邻居数量
:return:预测的分类标签
"""
#找到最近的邻居
neighbors=find_nearest_neighbors(X_train,y_train,X_test,k)
#统计每个类别的出现次数
class_count={}
forneighborinneighbors:
ifneighborinclass_count:
class_count[neighbor]+=1
else:
class_count[neighbor]=1
#选择出现次数最多的类别
sorted_class_count=sorted(class_count.items(),key=lambdax:x[1],reverse=True)
returnsorted_class_count[0][0]3.6使用Scikit-Learn库实现KNN虽然我们已经手动实现了KNN算法,但使用scikit-learn库可以更方便、更高效地完成同样的任务。下面是如何使用KNeighborsClassifier类来实现KNN。#数据预处理
scaler=StandardScaler()
X_train_std=scaler.fit_transform(X_train)
X_test_std=scaler.transform(X_test)
#创建KNN分类器
knn=KNeighborsClassifier(n_neighbors=3)
#训练模型
knn.fit(X_train_std,y_train)
#预测
y_pred=knn.predict(X_test_std)3.7模型评估最后,我们需要评估模型的性能。这可以通过比较预测结果和实际结果来完成,通常使用准确率、混淆矩阵和分类报告等指标。#计算准确率
accuracy=accuracy_score(y_test,y_pred)
print(f"Accuracy:{accuracy}")
#输出混淆矩阵
print("ConfusionMatrix:")
print(confusion_matrix(y_test,y_pred))
#输出分类报告
print("ClassificationReport:")
print(classification_report(y_test,y_pred))通过上述步骤,我们不仅手动实现了KNN算法,还使用了scikit-learn库来简化过程,并评估了模型的性能。这为理解和应用KNN算法提供了全面的视角。4案例分析4.1手写数字识别4.1.1理论基础手写数字识别是机器学习中的一个经典问题,K-近邻算法(KNN)可以有效地解决这一问题。KNN算法基于实例的学习方法,对于输入的待分类样本,KNN算法会在训练数据集中找到与之最接近的K个样本,然后根据这K个样本的类别来决定待分类样本的类别。在手写数字识别中,每个样本通常是一个二维图像,经过处理后转换为特征向量,用于计算距离。4.1.2数据准备我们将使用MNIST数据集,这是一个包含60000个训练样本和10000个测试样本的大型手写数字数据库。每个样本是一个28x28像素的灰度图像。fromsklearn.datasetsimportfetch_openml
importnumpyasnp
#加载MNIST数据集
mnist=fetch_openml('mnist_784',version=1)
X,y=mnist["data"],mnist["target"]
#将数据集分为训练集和测试集
X_train,X_test,y_train,y_test=X[:60000],X[60000:],y[:60000],y[60000:]
#将训练集和测试集的标签转换为整数类型
y_train=y_train.astype(np.uint8)
y_test=y_test.astype(np.uint8)4.1.3KNN算法实现使用scikit-learn库中的KNeighborsClassifier类来实现KNN算法。fromsklearn.neighborsimportKNeighborsClassifier
#创建KNN分类器实例
knn=KNeighborsClassifier(n_neighbors=3)
#训练模型
knn.fit(X_train,y_train)
#预测测试集
y_pred=knn.predict(X_test)4.1.4性能评估使用准确率来评估模型的性能。fromsklearn.metricsimportaccuracy_score
#计算准确率
accuracy=accuracy_score(y_test,y_pred)
print(f"准确率:{accuracy}")4.2鸢尾花分类4.2.1理论基础鸢尾花分类是另一个经典的机器学习问题,KNN算法同样适用。鸢尾花数据集包含150个样本,每个样本有4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,以及3个类别:Setosa、Versicolor和Virginica。4.2.2数据准备我们将使用scikit-learn库中的鸢尾花数据集。fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
#加载鸢尾花数据集
iris=load_iris()
X,y=iris.data,iris.target
#将数据集分为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)4.2.3KNN算法实现使用scikit-learn库中的KNeighborsClassifier类来实现KNN算法。fromsklearn.neighborsimportKNeighborsClassifier
#创建KNN分类器实例
knn=KNeighborsClassifier(n_neighbors=3)
#训练模型
knn.fit(X_train,y_train)
#预测测试集
y_pred=knn.predict(X_test)4.2.4性能评估使用准确率和混淆矩阵来评估模型的性能。fromsklearn.metricsimportaccuracy_score,confusion_matrix
#计算准确率
accuracy=accuracy_score(y_test,y_pred)
print(f"准确率:{accuracy}")
#计算混淆矩阵
cm=confusion_matrix(y_test,y_pred)
print("混淆矩阵:")
print(cm)4.2.5结论通过上述两个案例,我们看到了KNN算法在不同场景下的应用。手写数字识别和鸢尾花分类都是KNN算法的典型应用,通过调整K值和距离度量方法,可以优化模型的性能。在实际应用中,选择合适的K值和距离度量方法是关键,可以通过交叉验证等方法来确定。5参数调优与模型优化5.1选择合适的K值在K-近邻算法中,K值的选择至关重要。K值过小,模型容易受到噪声点的影响,导致过拟合;K值过大,模型可能过于简化,忽略数据集中的模式,导致欠拟合。选择合适的K值可以通过交叉验证(Cross-Validation)来实现。5.1.1示例:使用交叉验证选择K值假设我们有一个简单的数据集,包含两类数据点,我们将使用交叉验证来选择最佳的K值。importnumpyasnp
fromsklearn.model_selectionimportcross_val_score
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.datasetsimportmake_classification
#生成一个分类数据集
X,y=make_classification(n_samples=1000,n_features=10,n_informative=5,n_redundant=0,random_state=42)
#创建KNN分类器
knn=KNeighborsClassifier()
#使用交叉验证来测试不同的K值
k_values=list(range(1,31))
cv_scores=[]
forkink_values:
knn.set_params(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=5)
cv_scores.append(scores.mean())
#找到最佳的K值
optimal_k=k_values[cv_scores.index(max(cv_scores))]
print(f"Theoptimalnumberofneighborsis{optimal_k}")5.1.2解释在上述代码中,我们首先生成了一个分类数据集。然后,我们创建了一个KNN分类器,并使用cross_val_score函数来评估不同K值下的模型性能。通过比较不同K值的平均交叉验证得分,我们可以找到最佳的K值。5.2优化距离度量KNN算法使用距离度量来确定最近的邻居。默认情况下,scikit-learn使用欧氏距离,但根据数据的特性,其他距离度量如曼哈顿距离、闵可夫斯基距离等可能更合适。5.2.1示例:使用不同的距离度量我们将使用scikit-learn的KNeighborsClassifier来比较不同距离度量的效果。fromsklearn.metricsimportaccuracy_score
#使用欧氏距离
knn_euclidean=KNeighborsClassifier(n_neighbors=5,metric='euclidean')
knn_euclidean.fit(X_train,y_train)
y_pred_euclidean=knn_euclidean.predict(X_test)
print(f"AccuracywithEuclideandistance:{accuracy_score(y_test,y_pred_euclidean)}")
#使用曼哈顿距离
knn_manhattan=KNeighborsClassifier(n_neighbors=5,metric='manhattan')
knn_manhattan.fit(X_train,y_train)
y_pred_manhattan=knn_manhattan.predict(X_test)
print(f"AccuracywithManhattandistance:{accuracy_score(y_test,y_pred_manhattan)}")5.2.2解释在这个例子中,我们使用了两种不同的距离度量:欧氏距离和曼哈顿距离。通过比较模型在测试集上的准确率,我们可以评估哪种距离度量更适合我们的数据集。5.3处理不平衡数据集在现实世界的数据集中,类别分布往往不平衡,这可能会影响KNN算法的性能。一种处理不平衡数据集的方法是调整weights参数,使模型在预测时考虑不同类别的样本数量。5.3.1示例:使用加权距离我们将使用scikit-learn的KNeighborsClassifier,并设置weights参数为'distance',以处理不平衡数据集。#假设y_train是一个不平衡的标签分布
knn_weighted=KNeighborsClassifier(n_neighbors=5,weights='distance')
knn_weighted.fit(X_train,y_train)
y_pred_weighted=knn_weighted.predict(X_test)
print(f"Accuracywithweighteddistance:{accuracy_score(y_test,y_pred_weighted)}")5.3.2解释在这个例子中,我们通过设置weights='distance',使KNN模型在预测时考虑了距离的权重,从而在一定程度上缓解了类别不平衡带来的问题。这通常会提高模型在少数类上的预测性能。通过上述方法,我们可以有效地调优KNN模型,选择合适的K值,优化距离度量,并处理不平衡数据集,从而提高模型的预测准确性和泛化能力。6KNN算法的总结与应用扩展6.1KNN算法的总结K-近邻算法(K-NearestNeighbors,KNN)是一种基于实例的学习方法,用于分类和回归。其核心思想是:对于一个给定的样本,根据其在特征空间中的K个最近邻样本的类别来预测该样本的类别。KNN算法的步骤如下:计算距离:选择一个距离度量方法,计算待分类样本与训练集中的每个样本之间的距离。选择邻居:根据计算出的距离,选择距离最近的K个训练样本作为待分类样本的邻居。投票决策:对于分类任务,K个邻居中出现最多的类别将被赋予待分类样本;对于回归任务,K个邻居的平均值或加权平均值将作为预测值。6.1.1代码示例:使用scikit-learn实现KNN分类fromsklearn.datasetsimportload_iris
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.neighborsimportKNeighborsClassifier
fromsklearn.metricsimportaccuracy_score
#加载数据集
iris=load_iris()
X=iris.data
y=iris.target
#划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
#创建KNN分类器实例
knn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船舶制造业全员安全生产责任制度研究
- 大学生社团干部选举方案
- 制造业废旧电子设备回收方案
- 塑胶步道雨水排放设计方案
- “双减”政策下的学生心理健康工作总结
- 地铁站施工人员安全防护方案
- 商场新型冠状病毒防控方案
- 灵活工时制劳动合同范本
- 制造业绩效考核管理方案
- 2023年医用中心供氧系统项目评价分析报告
- 2024年抖音旅游运营规划方案
- 养生祛病一碗汤
- 代理记账业务规范和财务会计管理制度
- 劳务分包管理培训课件
- 防火墙端口日志分析与审计
- 电力企业合规培训课件
- 小学数学-除数是整十数的口算除法教学设计学情分析教材分析课后反思
- 生命科学与生物技术的发展
- 企业法律和合规要求课件
- 趣味化学知识讲座
- 《供应链风险管理计划书:应对潜在供应风险》
评论
0/150
提交评论