首页
/ ISLR-python项目解析:K近邻算法(KNN)实战指南

ISLR-python项目解析:K近邻算法(KNN)实战指南

2025-06-19 02:11:55作者:裴锟轩Denise

前言

K近邻算法(K-Nearest Neighbors, KNN)是机器学习中最简单直观的分类算法之一。本文将基于ISLR-python项目中的实验内容,深入讲解KNN算法的原理、实现方法以及在金融数据集上的应用实践。

KNN算法基础

KNN是一种基于实例的学习算法,其核心思想可以概括为"物以类聚"。对于一个待分类的样本,算法会找出训练集中与之最相似的K个样本,然后根据这K个样本的类别投票决定待分类样本的类别。

算法特点

  • 非参数方法:不对数据分布做任何假设
  • 惰性学习:训练阶段仅存储数据,计算推迟到预测阶段
  • 距离度量:通常使用欧氏距离,也可用曼哈顿距离等

实验准备

首先导入必要的Python库:

import pandas as pd
import numpy as np
from sklearn import neighbors
from sklearn.metrics import confusion_matrix, classification_report
from sklearn import preprocessing

案例一:股票市场方向预测

数据集介绍

我们使用Smarket数据集,包含2001-2005年间S&P 500指数的以下信息:

  • Lag1-Lag5:前5个交易日的收益率
  • Volume:前一天的交易量(十亿股)
  • Today:当日收益率
  • Direction:市场方向(Up/Down)
df = pd.read_csv('Smarket.csv', usecols=range(1,10), index_col=0, parse_dates=True)
df.head()

数据划分

将数据按时间划分为训练集(2001-2004)和测试集(2005):

X_train = df[:'2004'][['Lag1','Lag2']]
y_train = df[:'2004']['Direction']

X_test = df['2005':][['Lag1','Lag2']]
y_test = df['2005':]['Direction']

KNN模型构建与评估

使用K=1构建模型:

knn = neighbors.KNeighborsClassifier(n_neighbors=1)
pred = knn.fit(X_train, y_train).predict(X_test)

评估模型性能:

print(confusion_matrix(y_test, pred).T)
print(classification_report(y_test, pred, digits=3))

尝试K=3改进模型:

knn = neighbors.KNeighborsClassifier(n_neighbors=3)
pred = knn.fit(X_train, y_train).predict(X_test)
print(confusion_matrix(y_test, pred).T)
print(classification_report(y_test, pred, digits=3))

结果分析

实验表明,在这个数据集上KNN表现不佳,准确率仅略高于随机猜测。这说明市场方向预测可能需要更复杂的模型或更多特征。

案例二:保险购买预测

数据集介绍

Caravan数据集包含5,822个人的85个人口统计学特征,目标是预测是否会购买保险。只有6%的人购买了保险,数据存在严重不平衡。

df2 = pd.read_csv('Caravan.csv')
df2["Purchase"].value_counts()

数据标准化

KNN对特征尺度敏感,必须进行标准化处理:

y = df2.Purchase
X = df2.drop('Purchase', axis=1).astype('float64')
X_scaled = preprocessing.scale(X)

数据划分

前1000个样本作为测试集,其余作为训练集:

X_train = X_scaled[1000:,:]
y_train = y[1000:]
X_test = X_scaled[:1000,:]
y_test = y[:1000]

KNN模型构建与评估

使用K=1构建模型:

knn = neighbors.KNeighborsClassifier(n_neighbors=1)
pred = knn.fit(X_train, y_train).predict(X_test)
print(classification_report(y_test, pred, digits=3))

查看混淆矩阵:

print(confusion_matrix(y_test, pred).T)

结果解读

虽然整体准确率不高,但KNN成功识别出了部分潜在客户,预测购买的人群中实际购买比例(11.7%)是随机猜测(6%)的近两倍。这表明KNN在这个不平衡数据集上发现了有意义的模式。

KNN实践建议

  1. 特征标准化:KNN对特征尺度敏感,必须进行标准化
  2. K值选择:通过交叉验证选择最优K值,避免过拟合(K太小)或欠拟合(K太大)
  3. 距离度量:根据数据特点选择合适的距离度量方式
  4. 类别不平衡:考虑使用加权投票或调整分类阈值
  5. 降维处理:高维数据可先进行降维提高效率

总结

通过ISLR-python项目中的两个案例,我们实践了KNN算法在金融领域的应用。虽然KNN简单直观,但其性能高度依赖于数据特点和参数选择。在实际应用中,需要结合业务场景和数据特性进行适当的调整和优化。

登录后查看全文
热门项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
23
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
225
2.27 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
flutter_flutterflutter_flutter
暂无简介
Dart
526
116
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
987
583
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
351
1.42 K
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
61
17
GLM-4.6GLM-4.6
GLM-4.6在GLM-4.5基础上全面升级:200K超长上下文窗口支持复杂任务,代码性能大幅提升,前端页面生成更优。推理能力增强且支持工具调用,智能体表现更出色,写作风格更贴合人类偏好。八项公开基准测试显示其全面超越GLM-4.5,比肩DeepSeek-V3.1-Terminus等国内外领先模型。【此简介由AI生成】
Jinja
47
0
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
JavaScript
212
287