特征选择与特征提取都是机器学习和数据分析中的重要步骤,用于准备数据以供模型训练和分析使用。它们的目的是降低数据维度,提高模型性能,并减少噪声和冗余信息。
特征选择是从原始数据中选择最相关和最有价值的特征,以用于构建机器学习模型或分析任务。在金融领域,特征选择尤为重要,因为金融数据通常包含大量的特征,但并非所有的特征都对预测金融市场的变化或风险有用。下面介绍几种常见的特征选择方法,并提供一个金融领域的示例。
在现实应用中,常见的特征选择方法如下。
方差阈值选择:删除方差低于某个阈值的特征。在金融领域,某些特征可能不会随时间变化或只有很小的变化,这些特征对于预测可能没有太大帮助。
相关性选择:通过计算特征与目标变量之间的相关性来选择相关的特征。在金融领域,你可能希望选择与股票价格或投资回报率高度相关的特征,如经济指标、市场波动性等。
基于模型的选择:使用机器学习模型来评估特征的重要性,并选择最重要的特征。例如,可以使用随机森林模型或梯度提升树模型来计算每个特征的重要性分数,然后选择分数最高的特征。
正则化方法:在线性回归等模型中,正则化方法如Lasso(L1正则化)和Ridge(L2正则化)可以用于惩罚不重要的特征,促使模型选择最重要的特征。
递归特征消除(RFE):通过递归地训练模型并删除最不重要的特征来选择特征。这个方法通常与模型选择一起使用。
实例3-4:使用特征选择预测某股票的股价(源码路径:daima/3/te.py)
假设你想要预测股票价格,现在有一个包含大量特征的金融数据集文件ningde.csv,包含的列有日期、开盘价、收盘价、最高价、最低价、交易量的特征。本实例只截取了其中的极少数数据。
然后加载这个数据,并执行特征选择和建模的步骤。我们可以使用特征选择方法来选择最重要的特征,以提高股票价格预测模型的性能。首先,计算每个特征与股票价格之间的相关性。例如,可以计算股票价格与市场指数、公司财务指标、行业数据等特征之间的相关性,然后选择与股票价格高度相关的特征进行建模。
接下来,可以使用随机森林或梯度提升树等模型来计算每个特征的重要性分数。这些模型会告诉你哪些特征对于股票价格预测最关键。我们可以根据这些分数进一步筛选特征,选择最重要的特征。
最后,可以使用选定的特征来训练股票价格预测模型,这样可以减少维度并提高模型的性能,同时避免过拟合。这个过程可以帮助你构建更精确的金融预测模型。
编写实例文件te.py的具体实现代码如下所示。
上述代码的具体说明如下。
加载数据:使用 pd.read_csv() 函数从名为“ningde.csv”的CSV文件中加载股票数据,并存储在名为“data”的DataFrame中。
特征选择:通过计算特征与目标变量(收盘价)之间的相关性,确定了哪些特征与目标变量相关性较高。在示例中,通过计算相关性,筛选出与目标变量相关性大于0.2的特征,然后将它们存储在名为“selected_features”的列表中。
创建特征矩阵和目标变量:根据选定的特征,从原始数据中创建特征矩阵 X和目标变量 y。
数据拆分:使用函数train_test_split()将数据集拆分为训练集和测试集,其中80%的数据用于训练,20%的数据用于测试。拆分后的数据存储在X_train、X_test、y_train和y_test变量中。
使用随机森林回归模型:创建一个随机森林回归模型 rf_model,并使用训练数据对其进行训练。
输出特征的重要性分数:使用模型的 feature_importances_ 属性,计算每个特征的重要性分数,并按重要性排序输出。
评估模型性能:使用均方误差(MSE)评估模型的性能,计算模型在测试数据上的平均平方误差,并输出该值。
使用模型进行股票价格预测:使用训练好的模型对测试数据进行股票价格预测,将预测结果存储在 predicted_prices 中。
创建结果DataFrame和可视化:创建一个包含真实价格和预测价格的DataFrame results,并输出前10个预测结果。使用matplotlib绘制一个折线图,展示真实价格和模型预测价格之间的关系,以可视化评估模型的性能。
执行代码后会输出以下结果,并绘制一个股票价格的折线图,用于可视化比较模型的预测价格(虚线)和真实价格(实际折线),如图3-2所示。
图3-2 股票价格的折线图
以下是对图3-2的具体说明。
x 轴:样本索引,表示测试集中的每个数据点的索引。
y 轴:价格,表示股票的价格值。
真实价格(实际折线):是从测试集中提取的真实股票价格数据,每个点代表一个时间点的真实价格。
预测价格(虚线):是模型根据选定的特征和训练数据所做的预测,每个点代表相应时间点的模型预测的股票价格。
通过这个图表,可以直观地比较模型的预测价格和真实价格之间的关系。如果虚线紧密跟随实际折线,表示模型的预测较为准确。如果虚线与实际折线之间有较大差距,表示模型的预测可能不够准确。
从图表中可以看到模型的预测价格(虚线)相对接近真实价格(实际折线),这表明模型在这些时间点上的预测相对准确。但还需要进一步分析更多的时间点和使用其他评估指标来全面评估模型的性能。
特征提取是从原始数据中创建新特征的过程,这些新特征可以更好地表示数据的关键信息。特征提取的目标是减少数据的维度,同时保留或增强有助于机器学习模型的重要信息。这是机器学习和数据分析中的关键步骤之一,因为原始数据集可能包含大量特征,但并非所有特征都对建模和预测任务有用。
在现实应用中,常见的特征提取技术包括以下几种。
主成分分析(Principal Component Analysis,PCA):PCA是一种降维技术,通过线性变换将原始特征转换为一组称为主成分的新特征。这些主成分是原始特征的线性组合,按照它们的方差从大到小排列。PCA可以用于数据压缩和噪声去除。
独立成分分析(Independent Component Analysis,ICA):ICA也是一种降维技术,它试图找到原始数据中相互独立的成分。ICA通常用于信号处理和图像分析。
特征哈希(Feature Hashing):特征哈希是将原始特征映射到固定数量的桶或特征上的技术。这可以用于处理高维稀疏数据,如文本数据,以减小维度并生成特征向量。
自动特征工程:自动特征工程是使用机器学习方法来生成新特征的技术,如使用生成对抗网络或神经网络进行特征生成。这可以用于创建复杂的非线性特征。
时间序列特征提取:在金融领域,时间序列数据是一种常见的数据类型。时间序列特征提取方法包括计算移动平均值、技术指标(如RSI、MACD)、波动性指标等。
文本特征提取:在金融领域,文本数据包括新闻、社交媒体评论、公告等。文本特征提取方法包括词袋模型(Bag-of-Words Model)、词频-逆文档频率(Term Frequency-Inverse Document Frequency,TF-IDF)、Word Embeddings(词嵌入)等。
图像特征提取:如果金融数据包括图像,可以使用图像处理技术,如边缘检测、颜色直方图、纹理分析等,来提取特征。
假设想要预测股票市场的涨跌,可以考虑使用以下特征提取方法。
时间序列数据:计算股票价格和成交量的移动平均值、波动性指标(如标准差)、技术指标(如RSI、MACD)等。
文本数据:如果有新闻或社交媒体评论的文本数据,可以使用自然语言处理技术,如TF-IDF或Word Embeddings,来提取与市场情感相关的特征。
图像数据:如果你有与股票相关的图像数据,如股票图表或公司标志,你可以使用图像处理技术提取特征,如颜色分布、形状分析等。
通过这些特征提取方法,可以将原始金融数据转化为更有信息量的特征,以供机器学习模型使用,从而改进你的预测或分类任务。特征提取是根据数据和问题的性质选择合适的技术的关键步骤。
实例3-5:使用时间序列数据预测某股票的涨跌(源码路径:daima/3/zhang.py)
(1)假设在文件zhang.csv中保存了某股票的数据,包括日期、开盘价、最高价、最低价、收盘价和成交量的信息。请注意,这只是一个虚拟的示例数据集,用于演示和实验。在实际应用中,需要使用真实的股票或大盘指数数据。
(2)编写实例文件zhang.py,具体实现代码如下所示。
在上述代码中,首先加载时间序列数据,然后执行特征提取步骤,包括计算移动平均线、技术指标、波动性指标和成交量特征。接着,创建一个二元分类标签,表示涨跌情况。最后,使用随机森林分类器对特征进行训练,并评估模型性能。执行代码后会输出以下内容。
上述输出表示我们的模型在测试数据上表现得非常好,准确率达到了1.00,也就是100%。具体说明如下。
Precision(精确率):对于预测为涨(1)的样本,模型预测的准确比例为1.00,也就是100%。
Recall(召回率):模型成功捕获了所有实际为涨(1)的样本,召回率也为1.00,也就是100%。
F1-Score(F1分数):F1分数是精确率和召回率的调和平均值,对于二分类问题,F1分数是一个常用的综合性能度量。在这里,F1分数为1.00,也是最高分,表示模型的综合性能非常好。
Support(支持数):实际测试集中有6个样本。
综合来看,这个输出结果表明我们的模型在测试数据上的预测非常准确,完美地捕获了涨跌情况。然而,需要注意的是,这只是一个非常小的测试集,模型的表现可能在更大的、真实的数据集上有所不同。因此,在实际应用中,通常需要更多的数据来评估模型的性能。但就这个小数据集来说,模型对于预测涨跌表现出色。
在下面的实例中,我们将使用PyTorch构建一个简单的文本情感分类模型,使用TF-IDF特征对文本数据进行特征提取,然后训练模型并评估其在情感分类任务上的性能。
实例3-6:构建金融市场文本情感分类模型(源码路径:daima/3/qingxu.py)
实例文件qingxu.py的具体实现代码如下所示。
对上述代码的具体说明如下。创建包含文本数据和情感标签的DataFrame (data):这个DataFrame包含了一些关于股票市场情感的示例文本数据以及与每个文本相关的情感标签(积极或消极)。
使用 train_test_split 将数据集分割为训练集 (train_data) 和测试集 (test_data),其中测试集占总数据的20%。
使用 TfidfVectorizer 对文本数据进行特征提取:其中tfidf_vectorizer 用于初始化一个TF-IDF向量化器;tfidf_train_features 通过拟合向量化器并将其应用于训练数据,提取训练集的TF-IDF特征;tfidf_test_features 通过将向量化器应用于测试数据,提取测试集的TF-IDF特征。
将数据转换为PyTorch张量:将提取的TF-IDF特征和情感标签转换为PyTorch张量,以便进行深度学习模型的训练。
构建情感分类模型 (SentimentClassifier):这是一个简单的全连接神经网络模型,接受输入维度 input_dim 并输出二进制分类结果(0或1)。模型包含一个线性层 (nn.Linear),用于进行二分类任务。
初始化模型 (model),选择损失函数 (BCEWithLogitsLoss) 和优化器 (Adam)。
定义训练函数 (train) 和评估函数 (evaluate):train 函数用于训练模型,它迭代训练数据加载器 (iterator) 中的每个批次,计算损失并执行反向传播来更新模型参数。evaluate 函数用于评估模型,它迭代测试数据加载器,生成预测并将其转换为分类结果。
将数据转换为PyTorch的数据加载器 (train_loader 和 test_loader),以便进行批量训练和评估。
训练模型 (train):迭代多个时期 (N_EPOCHS),每个时期都使用训练数据进行模型训练。
评估模型 (evaluate):使用测试数据评估模型的性能,计算准确率并输出分类报告。
最后输出模型的准确率和分类报告。
在本实例中只用到了4条股民情感数据,保存在了text中。在实际应用中,需要抓取大量的股民情感数据,并保存到本地文件中。在下面的实例中,我们将从文本文件中读取情绪数据,然后使用 TF-IDF 特征提取和 PyTorch 构建一个情感分类模型,再对模型的性能进行评估和可视化处理。
实例3-7:构建金融市场文本情感分类模型的升级版(源码路径:daima/3/qingxu1.py)
(1)在文件your_data.txt 中保存了某日股民们的积极和消极情感标签的文本数据,我们可以基于这些数据进行模型的训练和评估。
(2)实例文件qingxu1.py的主要实现代码如下所示。
对上述代码的具体说明如下。从名为“your_data.txt”的文本文件中读取数据,并将每一行的文本和情感标签分割成一个列表。
创建一个包含文本和情感标签的 Pandas DataFrame (df),其中包含从文件中读取的数据。
使用 train_test_split 将数据集分割为训练集 (train_data) 和测试集 (test_data),其中测试集占总数据的20%。
使用 TfidfVectorizer 对文本数据进行特征提取,将文本数据转换为 TF-IDF 特征向量。
将提取的 TF-IDF 特征和情感标签转换为 PyTorch 张量,以便进行深度学习模型的训练。
构建一个情感分类模型 (SentimentClassifier),这是一个简单的全连接神经网络模型,用于进行情感分类任务。
初始化模型 (model),选择损失函数 (BCEWithLogitsLoss) 和优化器 (Adam)。
定义训练函数 (train) 和评估函数 (evaluate),用于训练和评估模型。
将数据转换为 PyTorch的数据加载器 (train_loader 和 test_loader),以便进行批量训练和评估。
训练模型 (train):迭代多个时期 (N_EPOCHS),每个时期都使用训练数据进行模型训练。
评估模型 (evaluate):使用测试数据评估模型的性能,计算准确率并输出分类报告。
输出模型的准确率和分类报告。
接下来,代码通过使用 Matplotlib 和 seaborn 库绘制混淆矩阵的可视化热力图,以更直观地展示模型的性能和分类效果。
总之,上述代码演示了如何从文本文件中读取数据,使用 TF-IDF 特征提取和 PyTorch 构建一个情感分类模型,然后对模型的性能进行评估和可视化。最后,它生成一个混淆矩阵的可视化热力图,用于展示分类结果和模型的性能。
上面的实例文件qingxu.py和qingxu1.py的执行结果的准确率为1.00,这是因为文件your_data.txt中的数据太少而导致的过拟合。在机器学习中,如果训练数据集太小,模型可能会记住训练数据的细节,而无法泛化到新的未见过的数据。这需要大家使用现实中真实的股民情感数据进行处理。