HDU杭电--机器学习实验报告(四)

一、 实验目的
1 、理解监督学习的目标;
2 、理解分类学习几种基本算法;
3 、掌握 Sklearn 提供的分类函数 k 近邻、朴素贝叶斯、支持向量
机、决策树、神经网络模型等。
二、 实验内容与要求
【实验内容】上涨指数涨跌预测
网易财经上获得的上证指数的历史数据,爬取了 20 年的上证指数
数据。请你根据给出某时间段 150 天的历史数据,预测当天上证指数
的涨跌。(技术路线 sklearn.svm.SVC
【实验过程】使用 SVM 算法
1 、建立工程,导入 sklearn
2 、数据加载 && 数据预处理
3 、创建 SVM 并进行交叉验证
【交叉验证】
交叉验证法先将数据集 D 划分为 k 个大小相似的互斥子集,每个
自己都尽可能保持数据分布的一致性,即从 D 中通过分层采样得到。
然后,每次用 k-1 个子集的并集作为训练集,余下的那个子集作为测试
; 这样就可获得 k 组训练 / 测试集,从而可进行 k 次训练和测试,最终
返回的是这个 k 个测试结果的均值。通常把交叉验证法称为 “k 者交叉
验证 k 最常用的取值是 10 ,此时称为 10 折交叉验证。
三、 实验程序与结果
# 用来加载 CSV 数据的工具包
import pandas as pd
# 支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
import numpy as np
# sklearn svm SVM 算法
from sklearn import svm
# sklearn cross_validation :交叉验证
from sklearn import model_selection
# CSV 文件中加载数据
data = pd.read_csv( '000777.csv' , encoding = 'gbk' , parse_dates =[ 0 ], index_col = 0 )
# DataFrame.sort_index(axis=0 ( 0 列排 ), ascending=True (升序) , inplace=False (排序后
是否覆盖原数据)) data 按照时间升序排列
data.sort_index( ascending = True , inplace = True ) # 选取 6 列数据作为特征:收盘价、最高价、最低价、开盘价、成交量、总市额
# dayfeature :选取 150 天的数据
# featurenum :选取的 6 个特征 * 天数
# x :记录 150 天的 6 个特征值 y :记录涨或者跌
dayfeature = 150
featurenum = 6 * dayfeature
# data.shape[0]-dayfeature ,我们要用 150 天数据做训练,
# 对于条目为 200 条的数据,只有 50 条数据是有前 150 天的数据来训练的,所以测试集的大小就
200-150 , 对于每一条数据,他的特征是前 150 天的所有特征数据,即 150*6
x = np.zeros((data.shape[ 0 ] - dayfeature, featurenum))
y = np.zeros((data.shape[ 0 ] - dayfeature))
for i in range ( 0 , data.shape[ 0 ] - dayfeature):
# 将数据中的收盘价、最高价、最低价、开盘价、成交量、总市额存入 x 数组中
# reshape: 转换成 1 行, featurenum
x[i, :] = np.array(data[i:i + dayfeature] \
[[ u' 收盘价 ' , u' 最高价 ' , u' 最低价 ' , u' 开盘价 ' , u' 成交量 ' , u' 总市值
' ]]).reshape(( 1 , featurenum))
# 如果当天收盘价高于开盘价, y[i]=1 代表涨, 0 代表跌
if data.iloc[i + dayfeature][ ' 收盘价 ' ] >= data.iloc[i + dayfeature][ ' 开盘价 ' ]:
y[i] = 1
else :
y[i] = 0
# 创建 SVM 并进行交叉验证
clf = svm.SVC( kernel = 'rbf' )
# 调用 svm 函数 , 并设置 kernel 参数,默认是 rbf ,其它: ‘linear’‘poly’‘sigmoid’
result = []
# 使用 KFold 进行 10 折交叉验证
kf = model_selection.KFold( n_splits = 10 )
for train_index, test_index in kf.split(x):
x_train, x_test = x[train_index], x[test_index]
y_train, y_test = y[train_index], y[test_index]
# 训练数据进行训练
clf.fit(x_train, y_train)
# 将预测数据和测试集的验证数据比对
result.append(np.mean(y_test == clf.predict(x_test)))
print ( "svm classifier accuacy:" )
print (result)
四、实验结果分析

svm classifier accuacy:
[0.49023861171366595, 0.4967462039045553, 0.48043478260869565, 0.5456521739130434,
0.6043478260869565, 0.5456521739130434, 0.5869565217391305, 0.5456521739130434,
0.5608695652173913, 0.5152173913043478]
这段代码实现了从股票数据中提取特征(收盘价、最高价、最低价、
开盘价、成交量、总市额),然后使用支持向量机( SVM )进行涨跌
预测,并进行了交叉验证。通过将数据集分割为训练集和测试集,并
多次进行交叉验证,可以更好地评估模型的性能,并减少过拟合的风
险。
代码运行后输出了 10 次交叉验证的结果,得到的分类器准确率分
别为: 0.490, 0.497, 0.480, 0.546, 0.604, 0.546, 0.587, 0.546, 0.561, 0.515
这些结果表示模型在不同的数据子集上的表现略有波动,但整体上表
现良好。由此可知,基于股票数据的特征,支持向量机模型能够在一
定程度上预测股票涨跌,但准确率存在一定的波动。
五、实验问题解答与体会
支持向量机( SVM )是一种强大的机器学习模型,特别适用于处理
非线性数据和高维数据。在股票涨跌预测问题中,数据往往具有复杂
的非线性关系,因此选择 SVM 模型进行分类是合适的。
而交叉验证是一种评估模型性能的有效方法,通过将数据集划分为
训练集和测试集,并多次重复这一过程,可以更准确地评估模型在不
同数据子集上的泛化能力,减少由于数据分布不均匀而引起的偏差。
在股票涨跌预测问题中,交叉验证可以帮助评估模型的预测能力和稳
定性。
此次试验让我明白了,在编写代码之前,务必仔细检查文件路径和
文件名,确保它们是正确的。在处理数据时,要格外注意数据的质量
和完整性,以避免在后续的分析和建模过程中出现问题。对于模型训
练效果不佳的情况,需要耐心和细心地调整模型参数、优化数据预处
理步骤,并且不断尝试不同的方法,直到找到合适的解决方案。通过
不断学习和尝试代码算法,才会得到实用的经验和教训。所以,在以
后的工作中,我们要保持持续学习的态度,不断改进和优化模型,提 高工作效率和质量。
  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值