第1关:KNN分类器

该代码片段展示了如何用KNN分类器对Iris数据集进行训练和测试,通过train_test_split进行数据划分,计算并输出测试准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

def knn_test():
    data_url = "/data/workspace/myshixun/home/iris_train.csv"
    df = pd.read_csv(data_url)
    X = df.iloc[:,1:4]
    y=df.iloc[:,4]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

    # 利用KNeighborsClassifier函数制作knn分类器
    # 选取最近的点的个数n_neighbors=3
    clf = KNeighborsClassifier(n_neighbors=3)
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    acc = np.sum(y_test == y_pred) / X_test.shape[0]
    
    return acc

# 测试函数
test_acc = knn_test()
print("Test Acc:", test_acc)

### 实现 KNN 算法的方法 KNN(k-Nearest Neighbors),即 k 最邻近算法,是一种有监督学习方法,在分类和回归任务中均有应用,不过更常被用来做分类工作[^1]。 #### 数据准备阶段 为了使 KNN 算法能够正常运作,首先需要准备好待分析的数据集。这包括收集样本数据及其对应的标签信息。对于鸢尾花数据集这样的标准数据集合来说,则可以直接通过 Scikit-Learn 库加载,并对其进行预处理操作,比如 z-score 标准化转换以确保不同特征之间具有可比性[^4]。 ```python from sklearn import datasets import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 加载鸢尾花数据集 iris = datasets.load_iris() X, y = iris.data, iris.target # 进行z-score标准化处理 scaler = StandardScaler().fit(X) X_scaled = scaler.transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.3, random_state=42) ``` #### 计算距离函数 核心部分在于定义一个计算两个点间欧氏距离或其他形式的距离度量方式的功能模块。此功能将帮助找到最近邻居们的位置所在: ```python def euclidean_distance(x1, x2): """Calculate the Euclidean distance between two vectors.""" return np.sqrt(np.sum((x1 - x2)**2)) ``` #### 预测过程 当给定一个新的未知实例时,可以通过遍历整个训练集中所有的已知样本来找出与其最接近的前 `k` 个邻居,并统计这些邻居所属类别出现次数最多的那一类作为最终预测结果。如果是为了提高准确性还可以考虑加权投票机制来决定输出类别[^2]。 ```python class KNNClassifier: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y def predict(self, X_new): predictions = [] for instance in X_new: distances = [euclidean_distance(instance, x_tr) for x_tr in self.X_train] # 找到最小距离索引位置 nearest_neighbors_indices = np.argsort(distances)[:self.k] # 获取对应标签列表 nearest_labels = [self.y_train[i] for i in nearest_neighbors_indices] # 统计频率最高的那个标签 most_common_label = max(set(nearest_labels), key=list(nearest_labels).count) predictions.append(most_common_label) return np.array(predictions) if __name__ == "__main__": knn_clf = KNNClassifier(k=5) knn_clf.fit(X_train, y_train) prediction_results = knn_clf.predict(X_test) accuracy_score = sum(prediction_results == y_test)/len(y_test)*100. print(f'Accuracy Score: {accuracy_score:.2f}%') ``` 上述代码实现了基本版的 KNN 分类器,并对其进行了简单验证。当然实际项目开发过程中还需要进一步完善异常情况处理逻辑等内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YLTommi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值