欢迎访问369期货网 369会员登录 注册

当前位置: 主页 > 期货量化

量化交易实战03 - 机器学习在交易中的基本应用(二)机器学习工具的基本使用方法(KNN算法用于回归)

时间:2025-10-15 16:15|来源:369期货网|作者:369期货网|点击:
前面西西给大家演示了一下KNN算法用于分类,今天演示一下KNN算法在回归的应用。

关于这个回归演示呢,如果有看到很久之前的量化学习类的书籍,就之前教材都是用的波士顿房价,但是这个数据集由于伦理问题(大概就是数据采集有黑人人口比例的变量,存在种族歧视,这个了解就行,不重要)已经被移除了,实践就会出现问题,西西这边演示用的是最新的加州住房数据集。
ok,开始我们今天的演示。
本章节与上一章节其实是一个内容,都是KNN算法的基础使用方法,所以先看前面再看这章哦。
量化交易实战02 - 机器学习在交易中的基本应用(二)机器学习工具的基本使用方法(KNN算法用于分类)


、KNN算法用于回归

上章节有朋友说让我贴代码,本章就直接贴代码了,西西还是建议初学者自己敲一下呀。
1.载入数据集并查看
    #载入加州住房房价数据集导入工具from sklearn.datasets import fetch_california_housing#将数据导入housing = fetch_california_housing()#查看数据的键名housing.keys()

    运行结果:

      dict_keys(['data', 'target', 'frame', 'target_names', 'feature_names', 'DESCR'])


      从运行结果可以看出,数据集中存储了5个键,这里我们重点关注target(房屋的售价)及feature_names(房屋的特征)。

      也就是说,我们需要训练模型,让它学习房屋特征和售价的关系,并且可以自动预测出新房屋的售价。

      下面来看一下数据中存储的特征都有哪些

      输入代码如下:

        #查看样本的特征名称housing.feature_names

        运行结果:

          ['MedInc',  'HouseAge',  'AveRooms',  'AveBedrms',  'Population',  'AveOccup',  'Latitude',  'Longitude']

          从代码运行结果可以看到,程序返回了样本全部的特征名称,共计7个。

          因为这里只是进行回归分析的演示,所以不展开讲解这些特征具体代表什么。感兴趣的读者可以自行查看scikit-learn官方文件进行深入了解。

          如果朋友希望继续了解房屋的价格是什么样子,可以使用下面这行代码来查看一下:

            #取前十套房屋查看售价housing.target[:10]

            运行结果:

              array([4.526, 3.585, 3.521, 3.413, 3.422, 2.697, 2.992, 2.414, 2.267,        2.611])

              接下来重复进行类似分类任务中的步骤,将数据集拆分为训练集和验证集。

              2.拆分数据集并训练模型

              为了防止新手运行错误,我把前面的全部加上来,如果是相对熟悉的朋友应该都之前,前面前面7行可以不用写。

                #将样本特征和售价赋值给X,yX,y= housing.data, housing.target#使用train_test_split拆分为训练集和验证集X_train,X_test,y_train, y_test =\train_test_split(X, y)#查看拆分的结果X_train.shape

                运行结果:

                  (15480, 8)


                  如果朋友也得到了这个结果,就说明你的数据集拆分成功。

                  下面开始模型的训练,输入代码如下:
                    #导入KNN回归算法from sklearn.neighbors import KNeighborsRegressor#创建一个实例,参数保持默认设置knn_reg = KNeighborsRegressor()#拟合训练集数据knn_reg.fit(X_train, y_train)#查看模型在训练集和验证集的性能表print('训练集准确率:%.2f'%knn_reg.score(X_train, y_train))print('验证集准确率:%.2f'%knn_reg.score (X_test, y_test))

                    运行结果:

                      训练集准确率:0.45 验证集准确率:0.15

                      从运行结果可以明显看到:缺省参数的KNN回归模型在该数据集中的性能表现差强人意,在训练集中的准确率只有45%,而在验证集中则更加糟糕,只有15%。这说明模型出现了欠拟合的问题,我们需要对数据集进行处理,或者对模型进行调优。

                      3.模型评估的不同方法和改进

                      相信朋友们和西西一样,发现了这样一个事情:

                      (这些理论要是暂时看不懂,或者理解不了,不要紧,只需要把后面的结论记下来,1+1为什么等于2不要紧,只需要记住1+1=2就行。)

                      不论是在分类模型中,还是回归模型中,我们都使用了.score()方法来评估模型的性能。然而,在两种模型中,score()方法所进行的计算是不一样的。在分类模型中,.score()返回的是模型预测的准确率(accuracy),其计算公式为

                      图片

                      在上面这个公式中,TP(True Positive)表示模型预测正确的正样本数量;TN(TrueNegative)表示模型预测正确的负样本数量;FP(False Positive)表示原本是负样本,却被模型预测为正样本的数量,也就是我们平时说的“假阳性”;FN(False Negative)表示原本是正样本,却被模型预测为负样本的数量,也就是“假阴性"。TP、FP、TN、FN的和就是所有的样本数量。也就是说,分类模型的准确率是模型预测正确的样本数量,除以全部参与预测的样本数量。当然,除了准确率之外,我们还可以用Precision、Recall、F1 score等方法来对分类模型进行性能评估,这里暂时不展开讲解。

                      (后面就是必须要记住的结论了住。

                      西西尝试对KNN回归的参数进行调整,看是否可以改进模型的性能。与分类模型一样,我们先使用网格搜索来寻找模型的最优参数。输入代码如下:

                        # 定义参数范围n_neighbors = tuple(range(1, 21, 1))# 创建网格搜索实例cv_reg = GridSearchCV(estimator=KNeighborsRegressor(),                      param_grid={'n_neighbors': n_neighbors},                      cv=5)# 使用网格搜索拟合训练数据cv_reg.fit(X_train, y_train)
                          {'n_neighbors': 9}

                          ennnnn,结果让我一度绝望。
                          朋友们如果没有理解错误,获取了最优参数9,我们就需要把这个带入模型进行验证。
                          西西不演示结果了,结果让人非常绝望。
                          侧面说明了这两年经济形势很复杂。可以做反向指标。

                          理论就讲完了,下期,我们将把KNN分类和回归模型用于股市,看一下是否适用。



                          编辑推荐

                          Copyright © 2024-2025 成都宁时科技有限公司 版权所有

                          蜀ICP备2022023994号