【机器学习系列】使用KNN模型进行数据分析和预测的完整流程

目录

一、导入数据

二、选择特征变量

三、划分训练集和测试集

四、训练KNN模型

五、进行预测

六、计算混淆矩阵

七、计算准确率

八、计算精确度

九、计算召回率

十、计算F1值

十一、计算十折交叉验证

十二、选取最优参数K值

(一)设置空列表用于储存分数

[(二) 通过for循环遍历K值](#(二) 通过for循环遍历K值)

[(三) 生成各个K值对应的模型评分](#(三) 生成各个K值对应的模型评分)

[(四) 绘制不同参数K对应的评分的折线图](#(四) 绘制不同参数K对应的评分的折线图)

[(五) 使用最佳参数n_neighbors=17建模](#(五) 使用最佳参数n_neighbors=17建模)


一、导入数据

复制代码
#将华南地区的数据作为样本数据,导入data变量中
import pandas
data = pandas.read_csv('华南地区.csv',encoding='utf8')
复制代码
#导入需要预测的华北地区数据
import pandas
华北地区数据 = pandas.read_csv('华北地区.csv',encoding='utf8')

二、选择特征变量

复制代码
#特征变量
x = data[['注册时长', '营收收入', '成本']]
#目标变量
y = data['是否续约']

三、划分训练集和测试集

复制代码
from sklearn.model_selection import train_test_split

#把数据集分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.3
)

四、训练KNN模型

复制代码
from sklearn.neighbors import KNeighborsClassifier
#新建一个KNN模型,设置个数为3
knnModel = KNeighborsClassifier(n_neighbors=3)
#使用训练集训练KNN模型
knnModel.fit(x_train, y_train)
#使用测试集测试KNN模型
knnModel.score(x_test, y_test)

在测试集上的准确率分数如下:

五、进行预测

复制代码
#预测测试数据集的目标变量
y_test_predict = knnModel.predict(x_test)

六、计算混淆矩阵

复制代码
#计算混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(
    y_test, 
    y_test_predict, 
    labels=['续约', '不续约']
)

七、计算准确率

复制代码
#准确率
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_test_predict)
#混淆矩阵
#array([[225,  82],
#       [ 56,  87]], dtype=int64)
#(225+87)/(225+82+56+87)

八、计算精确度

复制代码
#精确率
from sklearn.metrics import precision_score
precision_score(y_test, y_test_predict, pos_label="续约")
precision_score(y_test, y_test_predict, pos_label="不续约")
#混淆矩阵
#array([[225,  82],
#       [ 56,  87]], dtype=int64)
#(225)/(225+56)

九、计算召回率

复制代码
#召回率
from sklearn.metrics import recall_score
recall_score(y_test, y_test_predict, pos_label="续约")
recall_score(y_test, y_test_predict, pos_label="不续约")

#混淆矩阵
#array([[225,  82],
#       [ 56,  87]], dtype=int64)
#(225)/(225+82)

十、计算F1值

复制代码
#f1值
from sklearn.metrics import f1_score
f1_score(y_test, y_test_predict, pos_label="续约")
f1_score(y_test, y_test_predict, pos_label="不续约")

#混淆矩阵
#array([[225,  82],
#       [ 56,  87]], dtype=int64)
#2/(1/((225)/(225+56)) + 1/((225)/(225+82)))

十一、计算十折交叉验证

复制代码
from sklearn.model_selection import cross_val_score
#进行K折交叉验证
knnModel = KNeighborsClassifier(n_neighbors=3)
cvs = cross_val_score(knnModel, x, y, cv=10)
cvs
cvs.mean()

十二、选取最优参数K值

(一)设置空列表用于储存分数

复制代码
from sklearn.metrics import make_scorer
#用来保存KNN模型的邻居个数
ks = []
#用来保存准确率
accuracy_means = []
#用来保存精确率
precision_means = []
#用来保存召回率
recall_means = []
#用来保存f1值
f1_means = []

(二) 通过for循环遍历K值

复制代码
#n_neighbors参数,从2到29,一个个尝试
for k in range(2, 30):
    #把n_neighbors参数保存起来
    ks.append(k)
    #改变KNN模型的参数n_neighbors为k
    knnModel = KNeighborsClassifier(n_neighbors=k)
    #计算10折交叉验证的准确率
    accuracy_cvs = cross_val_score(
        knnModel, 
        x, y, cv=10, 
        scoring=make_scorer(accuracy_score)
    )
    #将10折交叉验证的准确率的均值保存起来
    accuracy_means.append(accuracy_cvs.mean())
    #计算10折交叉验证的精确率
    precision_cvs = cross_val_score(
        knnModel, 
        x, y, cv=10, 
        scoring=make_scorer(
            precision_score, 
            pos_label="续约"
        )
    )
    #将10折交叉验证的精确率的均值保存起来
    precision_means.append(precision_cvs.mean())
    #计算10折交叉验证的召回率
    recall_cvs = cross_val_score(
        knnModel, 
        x, y, cv=10, 
        scoring=make_scorer(
            recall_score, 
            pos_label="续约"
        )
    )
    #将10折交叉验证的召回率的均值保存起来
    recall_means.append(recall_cvs.mean())
    #计算10折交叉验证的f1值
    f1_cvs = cross_val_score(
        knnModel, 
        x, y, cv=10, 
        scoring=make_scorer(
            f1_score, 
            pos_label="续约"
        )
    )
    #将10折交叉验证的f1值的均值保存起来
    f1_means.append(f1_cvs.mean())

(三) 生成各个K值对应的模型评分

复制代码
#生成参数对应的模型评分
scores = pandas.DataFrame({
    'k': ks,
    'precision': precision_means,
    'accuracy': accuracy_means,
    'recall': recall_means,
    'f1': f1_means
})

(四) 绘制不同参数K对应的评分的折线图

复制代码
#绘制不同参数对应的评分的折线图
scores.plot(
    x='k', 
    y=['accuracy', 'precision', 'recall', 'f1']
)

(五) 使用最佳参数n_neighbors=17建模

复制代码
#使用最佳参数n_neighbors=17建模
knnModel = KNeighborsClassifier(n_neighbors=17)
#使用所有训练样本训练模型
knnModel.fit(x, y)
#对未知的目标数据进行预测
华北地区数据['预测续约'] = knnModel.predict(
    华北地区数据[['注册时长', '营收收入', '成本']]
)

pandas.options.display.max_columns = None
pandas.options.display.max_rows = None
华北地区数据[['注册时长','营收收入','成本','预测续约']]

预测结果如下:

相关推荐
2501_940198691 天前
从“数据孤岛”到“智慧医脑”:实战 MCP 协议安全接入 HIS 系统,构建医疗级 AI 辅助诊断合规中台
人工智能·安全·asp.net
70asunflower1 天前
基于锚点(聚类)的LLM微调
机器学习·数据挖掘·聚类
kuankeTech1 天前
解决内外贸双轨制难题,外贸ERP智能引擎同步管理国内外合规与标准
大数据·人工智能·数据可视化·软件开发·erp
Hcoco_me1 天前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
BHXDML1 天前
第九章:EM 算法
人工智能·算法·机器学习
q_35488851531 天前
AI大模型:python新能源汽车推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 大数据毕业设计(源码+文档)✅
大数据·人工智能·python·机器学习·信息可视化·汽车·推荐算法
陆研一1 天前
2026国内无痛使用Gemini 3与GPT-5.2
人工智能·ai·chatgpt
Honmaple1 天前
加载 .env 文件
人工智能
愚公搬代码1 天前
【愚公系列】《AI+直播营销》038-直播间装修和布置(直播间的设备选择)
人工智能
就爱吃香菜11 天前
跨越网络的连接艺术:实战基于 SSE 传输层的远程 MCP 服务部署,实现云端 AI 与本地资产联动
网络·人工智能