热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习|机器学习分类和基于Sklearn库的SVM模型实例

机器学习分类和基于Sklear


1

机器学习的基本概念

如今人工智能成为一大热门话题,一些专业术语如机器学习、深度学习等逐渐被大家所熟悉,那么它们到底是什么?它们之间究竟有怎样的关系呢?

我们通过一张图直观感受一下。

人工智能范围很广,泛指通过计算机实现人的头脑思维,使得机器像人一样去决策。

机器学习是人工智能的重要分支,是实现人工智能的一种技术。其涉及概率论、统计学、逼近论、凸分析、计算复杂度等多门学科。

深度学习是机器学习的一个分支,它也是传统神经网络的延伸,通过神经网络模型来模拟人脑进行学习,使其具有更强大的表达能力。卷积神经网络(Convolutional Neural Networks)、递归神经网络(Recurrent Neural Networks)都属于深度学习的范畴。你肯定听说过谷歌旗下DeepMind公司开发的AlphaGo战胜人类顶尖围棋选手。这里AlphaGo主要的工作原理就是深度学习。

自然语言处理则是深度学习发展的产物。

总而言之,深度学习是机器学习的一个子集,机器学习是人工智能的一个子集。


2

机器学习的分类 

机器学习最常见的表现形式是通过某种特定的算法,用大量的数据进行训练、建模,并利用训练好的模型和新的输入进行预测或分类。

根据机器学习算法的学习方式,可以将其分为监督学习(Supervised Learning)、非监督学习(Unsupervised Learning)、半监督学习(Semi-Supervised Learning)和强化学习(Reinforcement Learning)。

监督学习是使用已知正确答案的示例来训练网络的,也就是需要明确的标签。监督学习主要解决回归问题和分类问题。回归问题针对连续型变量。对训练数据拟合适当的模型 y=f(x),这里 y 是数据的标签,而对于一个新的自变量 x,通过 y=f(x) 得到标签 y。分类问题与回归最大的区别在于,分类是针对离散型变量,输出的结果是有限的。分类需要将数据分为不同的类别,通过训练的模型对数据进行分类。

非监督学习不需要明确的标签,适用于无标签数据集。它通过学习数据中的内在特征(特殊结构),将其组织成群(聚类)。

半监督学习结合了监督学习和非监督学习的特点,训练时结合了大量无标签数据和少量标签数据,在数据服从同一分布的情况下,对无标签数据进行非监督学习获得标签,并与标签数据共同用于解决问题。与前两者相比,半监督学习在训练时可以更为准确,而且训练成本更低。

强化学习与前面的定义都不相同,它也使用无标签数据,通过定义一个智能体,并让智能体与环境进行交互,通过一些方法(奖罚函数)得到环境的反馈,从而对学习策略进行训练和调整,以实现最大的环境奖励。

我们通过思维导图将机器学习的方法进行归纳。


3

机器学习常见算法

BP神经网络

BP神经网络是一种多层的前馈神经网络,通常由输入层、隐含层和输出层组成,主要特点是信号的正向传播和误差的反向传播。基本思想是梯度下降法,利用梯度搜索技术,使得网络的实际输出值和期望输出值的误差均方差为最小。BP神经网络基本结构见图。

决策树

决策树是一种基本的分类和回归方法。

决策树由结点和有向边组成。一般的,一颗决策树包含一个根结点、若干个内部结点和若干个叶结点。其中内部节点表示一个特征或属性,叶结点表示一个类。叶结点对应于决策结果,其他每个结点对应于一个属性测试。

根结点包含样本全集,从根结点到每一个叶结点的路径对应了一个判定测试序列,路径中每个结点包含的样本集合根据属性测试的结果被划分到子节点中。

在上图中,圆盒方框分别代表内部结点和叶结点。

决策树的学习目的是为了产生一棵泛化能力强的树,即处理未见示例的能力强。

随机森林

在机器学习中,存在的一个重大的问题是过拟合问题,但在大多数情况下对于随机森林模型而言不会那么容易出现,因为随机森林可以将多棵树组合成一个集合模型,这能降低决策树模型的高方差。随着随机森林规模的扩大,过拟合问题会逐渐削弱。

随机森林模型在bagging集合策略的基础上进行了修改,在原样本集中通过多次随机可重复的抽样得到多个数据集,对每个数据集构造一棵决策树,随机森林由很多无关联的决策树组成,构造过程是通过将数据集中的样本点分到左右两个子集中实现的,此迭代过程执行到最大树深度或不能通过继续分割获得最大信息增益为止,随机森林回归模型通过取平均值的方法得到预测结果,算法流程如下图所示。

支持向量机

支持向量机(SVM)是监督学习算法,直观思想是:寻找一个能够最大程度分隔两类样本的超平面。在二维中,你可以将超平面视为一条线。

从直观来看,最佳超平面可以让两类样本中的点到这条直线的最短距离最大,由于在实际中决定超平面的往往是靠近这个边界的几个点,我们称之为支持向量。SVM学习算法找到导致超平面最好地分离类的系数。

下图中介绍的是一种最简单的线性svm,它将一个线性函数作为决策边界,即可实现将两种类别的数据进行分类。

当两种数据的分布如下图所示时,通过简单的线性边界就无法实现划分,我们称之为线性不可分。

面对线性不可分数据,通过需要借助一种工具——核函数,通过它将原空间的数据映射到新的空间(通常是更高维度的空间),在新的特征空间里寻找一个能够最大程度分隔两类样本的超平面。


4

基于Sklearn库实现SVM模型 

经过前面的相关知识梳理,相信大家对机器学习有了一些了解,下面将介绍如何通过Sklearn库来实现支持向量机模型。

我们需要利用Tushare库获取数据集。Tushare是免费、开源的python量化库,能够为金融分析人员提供多样的便于分析的数据。

这里我们以神州高铁从2019年1月1日至2020年12月1日作为原始数据集,首先我们对数据集进行处理。

import tushare as ts
ts.set_token('token')
pro = ts.pro_api()
data = pro.daily(ts_code='000008.SZ',start_date='20190101',end_date='20201201',
               fields='ts_code,trade_date,open,close')
data = data.reindex(index=data.index[::-1])
data = data.reset_index(drop=True)

我们的目标是通过过去10天的收盘价信息预测判断第二天的涨跌。假设收盘价 > 开盘价,第二天涨,标记为1,否则标记为0.

data['rof']=data['close']-data['open']
narray=data[['rof''close']].values
x=[]
y=[]
day=10
for i in range(len(narray) - day - 1):
    x.append(narray[i:i+day, 1])
    if narray[i+day, 0] > 0:
       y.append(1)
    else:
       y.append(0)

利用Sklearn库的train_test_split函数按照7:3的比例划分训练集和测试集

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)

在获得训练数据和测试数据后,可以利用Sklearn库中的SVM模块建立模型了。

from sklearn.svm import SVC
svm_model=SVC(kernel='linear')
svm_model.fit(x_train,y_train)
predict=svm_model.predict(x_train)

利用metric模块计算预测结果的准确性

from sklearn.metrics import accuracy_score
print(accuracy_score(y_train,predict))
predict1=svm_model.predict(x_test)
print(accuracy_score(y_test,predict1))

输出结果:

0.5772870662460567
0.6131386861313869

可以看到训练集数据预测的准确率约为58%,测试集的预测结果准确率约为61%.

完整代码为:

import tushare as ts
def cleandata(ts_code,start_date,end_date,day=10):
    ts.set_token('token')
    pro = ts.pro_api()
    data = pro.daily(ts_code=ts_code,start_date=start_date,end_date=end_date,
               fields='ts_code,trade_date,open,close')
    data = data.reindex(index=data.index[::-1])
    data = data.reset_index(drop=True)
    data['rof'] = data['close']-data['open']
    narray=data[['rof''close']].values
    x=[]
    y=[]
    day=10
    for i in range(len(narray) - day - 1):
        x.append(narray[i:i+day, 1])
        if narray[i+day, 0] > 0:
           y.append(1)
        else:
           y.append(0)
    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)
    return x_train, y_train, x_test, y_test
if __name__=='__main__':
    x_train, y_train, x_test, y_test=cleandata('000008.SZ','20190101','20201201')
from sklearn.svm import SVC
svm_model=SVC(kernel='linear')
svm_model.fit(x_train,y_train)
predict=svm.predict(x_train)
from sklearn.metrics import accuracy_score
print(accuracy_score(y_train,predict))
predict1=svm_model.predict(x_test)
print(accuracy_score(y_test,predict1))

上面我们利用10日收盘价预测次日的涨跌情况,下面我们将输入序列改为CCI等技术指标,利用前一日的技术指标及收盘价预测次日的涨跌情况。完整代码如下:

import tushare as ts
import talib
def cleandata(ts_code,start_date,end_date,period=21):
    ts.set_token('token')
    pro = ts.pro_api()
    data = pro.daily(ts_code=ts_code,start_date=start_date,end_date=end_date,
               fields='ts_code,trade_date,open,close,high,low')
    data = data.reindex(index=data.index[::-1])
    data = data.reset_index(drop=True)
    data['rof']=data['close']-data['open']
    data['CCI']=talib.CCI(data['high'],data['low'],data['close'],timeperiod=period)
    data['RSI']=talib.RSI(data['close'],timeperiod=period)
    data['ATR']=talib.ATR(data['high'],data['low'],data['close'],timeperiod=period)
    narray=data[['close',CCI','RSI','ATR','rof']].values
    print(narray)
    x=[]
    y=[]
    for i in range(len(narray)-1):
        x.append(narray[i,0:4])
        if narray[i+1,4]>0:
           y.append(1)
        else:
           y.append(0)
    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)
    return x_train, y_train, x_test, y_test
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
x_train, y_train, x_test, y_test = cleandata('
000008.SZ', '20190101', '20201201')
svm_model=SVC(kernel='
linear')
svm_model.fit(x_train,y_train)
predict1=svm_model.predict(x_test)
print(accuracy_score(y_test,predict1))

得到的准确率如下:

0.631578947368421

可以看到,利用技术指标的预测结果的准确率略高于利用收盘价序列的预测结果。虽然股票价格是难以预测的,但是增加输入特征有助于提高准确度。

期待你的 分享 点赞 在看


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 读手语图像识别论文笔记2
    文章目录一、前言二、笔记1.名词解释2.流程分析上一篇快速门:读手语图像识别论文笔记1(手语识别背景和方法)一、前言一句:“做完了&#x ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 1.组合最优化问题定义:是通过数学方法的研究去寻找离散事件的最优编排、分组、次序或筛选等。描述:最优化问题的数学模型的一般描述是,x为决策 ... [详细]
  • OCR:用字符识别方法将形状翻译成计算机文字的过程Matlab:商业数学软件;CUDA:CUDA™是一种由NVIDIA推 ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
author-avatar
zavier
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有