一、
实验目的
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
模型进行分类是合适的。
而交叉验证是一种评估模型性能的有效方法,通过将数据集划分为
训练集和测试集,并多次重复这一过程,可以更准确地评估模型在不
同数据子集上的泛化能力,减少由于数据分布不均匀而引起的偏差。
在股票涨跌预测问题中,交叉验证可以帮助评估模型的预测能力和稳
定性。
此次试验让我明白了,在编写代码之前,务必仔细检查文件路径和
文件名,确保它们是正确的。在处理数据时,要格外注意数据的质量
和完整性,以避免在后续的分析和建模过程中出现问题。对于模型训
练效果不佳的情况,需要耐心和细心地调整模型参数、优化数据预处
理步骤,并且不断尝试不同的方法,直到找到合适的解决方案。通过
不断学习和尝试代码算法,才会得到实用的经验和教训。所以,在以
后的工作中,我们要保持持续学习的态度,不断改进和优化模型,提
高工作效率和质量。