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

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

2025-06-19 10:24:16作者:裴锟轩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简单直观,但其性能高度依赖于数据特点和参数选择。在实际应用中,需要结合业务场景和数据特性进行适当的调整和优化。

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

热门内容推荐

最新内容推荐

项目优选

收起
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
144
1.93 K
kernelkernel
deepin linux kernel
C
22
6
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
192
274
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
145
189
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
930
553
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
423
392
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
75
66
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.11 K
0
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
64
511