首页
/ 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简单直观,但其性能高度依赖于数据特点和参数选择。在实际应用中,需要结合业务场景和数据特性进行适当的调整和优化。

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

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
260
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
854
505
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
254
295
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
331
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
397
370
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
21
5