【2】监督学习--1--分类-支持向量机(svm)

案例:上证指数涨跌预测

数据介绍:

上证指数涨跌预测 网易财经上获得的上证指数的历史数据,爬取了20年的上证指数数据。 实验目的: 根据给出当前时间前150天的历史数据,预测当天上证指数的涨跌。

技术路线:sklearn.svm.SVC

import pandas as pd
import numpy as np
from sklearn import svm
from sklearn import cross_validation

data=pd.read_csv('stock/000777.csv',encoding='gbk',parse_dates=[0],index_col=0) #(数据源, encoding=编码格式为gbk, parse_dates=第0列解析为日期, index_col= 用作行索引的列编号)
data.sort_index(0,ascending=True,inplace=True) #详细解释( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html ) DataFrame.sort_index(axis=0 (按0列排), ascending=True(升序), inplace=False(排序后是否覆盖原 数据))data 按照时间升序排列

dayfeature=150
featurenum=5*dayfeature
x=np.zeros((data.shape[0]-dayfeature,featurenum+1))
y=np.zeros((data.shape[0]-dayfeature))

#参数解释:
选取5列数据作为特征:收盘价 最高价 最低价 开盘价 成交量 dayfeature:选取150天的数据 featurenum:选取的5个特征*天数 x:记录150天的5个特征值
y:记录涨或者跌
data.shape[0]-dayfeature意思是因为我们要用150天数据做训练,对于条目为200条的数据,只有50条数 据是有前150天的数据来训练的,所以训练集的大小就是200-150, 对于每一条数据,他的特征是前150 天的所有特征数据,即150*5, +1是将当天的开盘价引入作为一条特征数据



for i in range(0,data.shape[0]-dayfeature):
    x[i,0:featurenum]=np.array(data[i:i+dayfeature] \
          [[u'收盘价',u'最高价',u'最低价',u'开盘价',u'成交量']]).reshape((1,featurenum))
    x[i,featurenum]=data.ix[i+dayfeature][u'开盘价']

for i in range(0,data.shape[0]-dayfeature):
    if data.ix[i+dayfeature][u'收盘价']>=data.ix[i+dayfeature][u'开盘价']:
        y[i]=1
    else:
        y[i]=0          

clf=svm.SVC(kernel='rbf')  #
//调用svm函数,并设置kernel参数,默认是rbf,其它:‘linear ’‘poly’‘sigmoid’

result = []
for i in range(5):
    x_train, x_test, y_train, y_test = \
                cross_validation.train_test_split(x, y, test_size = 0.2) #//x和y的验证集和测试集,切分80-20%的测试集
    clf.fit(x_train, y_train)
    result.append(np.mean(y_test == clf.predict(x_test)))  #/将预测数据和测试集的验证数据比对
print("svm classifier accuacy:")
print(result)

交叉验证

基本思想:

交叉验证法先将数据集D划分为k个大小相似的互斥子集,每个自己都尽可能保持数 据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为 训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行k 次训练和测试,最终返回的是这个k个测试结果的均值。通常把交叉验证法称为“k者 交叉验证”, k最常用的取值是10,此时称为10折交叉验证。

参考资料

  • 北京理工大学 礼欣 www.python123.org
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学