19、机器学习中的特征交互与股票价格预测

机器学习中的特征交互与股票价格预测

在机器学习领域,特征工程和算法选择对于解决各种实际问题起着至关重要的作用。本文将深入探讨特征交互在广告点击预测中的应用,以及如何运用回归算法进行股票价格预测。

特征交互在广告点击预测中的应用

在点击日志数据的众多特征中,有些特征本身的信号非常微弱。例如,性别本身对于判断某人是否会点击广告提供的信息不多,设备型号本身也没有太多有用信息。然而,通过组合多个特征,我们能够创建更强的合成信号,这就是特征交互的目的。

特征交互的类型
  • 数值特征 :通常通过将多个数值特征相乘来生成新特征,也可以自定义集成规则。例如,从家庭收入和家庭规模这两个原始特征生成一个新特征“收入/人”。
  • 分类特征 :特征交互表现为对两个或多个特征进行“与”操作。例如,从性别和网站域名这两个原始特征生成一个新特征“性别:网站域名”。
应用特征交互进行点击预测的步骤
  1. 导入模块 :从 PySpark 中导入特征交互模块 RFormula。
from pyspark.ml.feature import RFormula
  1. 定义交互公式 :以 C14 和 C15 两个特征为例,定义交互公式。
cat_inter = ['C14', 'C15']
cat_no_inter = [c for c in categorical if c not in cat_inter]
concat = '+'.join(categorical)
interaction = ':'.join(cat_inter)
formula = "label ~ " + concat + '+' + interaction
print(formula)
  1. 初始化特征交互器 :使用定义好的公式初始化特征交互器,并设置处理无效值的方式。
interactor = RFormula(
    formula=formula,
    featuresCol="features",
    labelCol="label").setHandleInvalid("keep")
  1. 拟合和转换数据 :使用定义好的特征交互器对训练数据进行拟合和转换。
interactor.fit(df_train).transform(df_train).select("features").show()
  1. 构建管道 :将特征交互器和分类模型(如逻辑回归)组合成一个管道,以更好地组织整个工作流程。
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline

classifier = LogisticRegression(maxIter=20, regParam=0.000, elasticNetParam=0.000)
stages = [interactor, classifier]
pipeline = Pipeline(stages=stages)

model = pipeline.fit(df_train)
predictions = model.transform(df_test)
predictions.cache()
  1. 评估模型性能 :使用二元分类评估器评估模型的性能,计算 AUC 值。
from pyspark.ml.evaluation import BinaryClassificationEvaluator

ev = BinaryClassificationEvaluator(rawPredictionCol = "rawPrediction", metricName = "areaUnderROC")
print(ev.evaluate(predictions))

通过引入特征 C14 和 C15 之间的交互,AUC 从无交互时的 74.89%提升到了 74.90%。

股票价格预测与回归算法

股票价格预测是一个备受关注的问题,许多金融、交易和科技公司都在积极研究使用机器学习技术来预测股票价格。

股票市场和股票价格概述
  • 股票的含义 :公司的股票代表对公司的所有权。一股股票代表按总股数比例对公司部分资产和收益的索取权。
  • 股票交易和价格波动 :股票可以通过证券交易所和相关组织在股东和其他方之间进行交易。股票价格的波动主要受供求关系的影响。
  • 分析方法 :主要有基本面分析和技术分析两种方法来理解导致价格变化的因素并预测未来股票价格。
回归的概念

回归是机器学习中监督学习的另一个主要实例。给定包含观测值及其相关连续输出值的训练数据集,回归的目标是探索观测值(也称为特征)与目标之间的关系,并根据未知样本的输入特征输出一个连续值。回归与分类的主要区别在于,回归的输出值是连续的,而分类的输出值是离散的。

典型的回归问题
  • 基于位置、平方英尺、卧室和浴室数量预测房价。
  • 基于系统进程和内存信息估计电力消耗。
  • 预测零售库存。
  • 预测股票价格。
挖掘股票价格数据

为了更好地说明和推广价格回归方法,我们将重点关注道琼斯工业平均指数(DJIA)。在每个交易日,股票价格会实时变化并记录。以下是一些关键的交易指标:
| 指标 | 含义 |
| ---- | ---- |
| 开盘价 | 给定交易日的起始价格 |
| 收盘价 | 该日的最终价格 |
| 最高价 | 该日股票交易的最高价格 |
| 最低价 | 该日股票交易的最低价格 |
| 成交量 | 该日市场收盘前交易的总股数 |

除了 DJIA,其他主要指数还包括标准普尔 500 指数、纳斯达克综合指数、罗素 2000 指数和伦敦富时 100 指数。

特征工程

在股票价格预测中,特征工程非常重要。我们可以从历史和当前的开盘价以及历史表现(最高价、最低价和成交量)等因素来预测 DJIA 的收盘价。为了提高预测能力,我们可以生成更多的特征。

  • 平均价格特征 :计算过去一周、一个月和一年的平均收盘价,并计算不同时间框架平均价格之间的比率。
  • 平均成交量特征 :计算不同时间框架的平均成交量,并计算相应的比率。
  • 价格波动特征 :计算收盘价和成交量的标准差,并计算标准差之间的比率。
  • 收益率特征 :计算每日、每周、每月和每年的收益率,并计算移动平均值。
实现特征生成的代码
import pandas as pd

def add_original_feature(df, df_new):
    df_new['open'] = df['Open']
    df_new['open_1'] = df['Open'].shift(1)
    df_new['close_1'] = df['Close'].shift(1)
    df_new['high_1'] = df['High'].shift(1)
    df_new['low_1'] = df['Low'].shift(1)
    df_new['volume_1'] = df['Volume'].shift(1)

def add_avg_price(df, df_new):
    df_new['avg_price_5'] = df['Close'].rolling(5).mean().shift(1)
    df_new['avg_price_30'] = df['Close'].rolling(21).mean().shift(1)
    df_new['avg_price_365'] = df['Close'].rolling(252).mean().shift(1)
    df_new['ratio_avg_price_5_30'] = df_new['avg_price_5'] / df_new['avg_price_30']
    df_new['ratio_avg_price_5_365'] = df_new['avg_price_5'] / df_new['avg_price_365']
    df_new['ratio_avg_price_30_365'] = df_new['avg_price_30'] / df_new['avg_price_365']

def add_avg_volume(df, df_new):
    df_new['avg_volume_5'] = df['Volume'].rolling(5).mean().shift(1)
    df_new['avg_volume_30'] = df['Volume'].rolling(21).mean().shift(1)
    df_new['avg_volume_365'] = df['Volume'].rolling(252).mean().shift(1)
    df_new['ratio_avg_volume_5_30'] = df_new['avg_volume_5'] / df_new['avg_volume_30']
    df_new['ratio_avg_volume_5_365'] = df_new['avg_volume_5'] / df_new['avg_volume_365']
    df_new['ratio_avg_volume_30_365'] = df_new['avg_volume_30'] / df_new['avg_volume_365']

def add_std_price(df, df_new):
    df_new['std_price_5'] = df['Close'].rolling(5).std().shift(1)
    df_new['std_price_30'] = df['Close'].rolling(21).std().shift(1)
    df_new['std_price_365'] = df['Close'].rolling(252).std().shift(1)
    df_new['ratio_std_price_5_30'] = df_new['std_price_5'] / df_new['std_price_30']
    df_new['ratio_std_price_5_365'] = df_new['std_price_5'] / df_new['std_price_365']
    df_new['ratio_std_price_30_365'] = df_new['std_price_30'] / df_new['std_price_365']

def add_std_volume(df, df_new):
    df_new['std_volume_5'] = df['Volume'].rolling(5).std().shift(1)
    df_new['std_volume_30'] = df['Volume'].rolling(21).std().shift(1)
    df_new['std_volume_365'] = df['Volume'].rolling(252).std().shift(1)
    df_new['ratio_std_volume_5_30'] = df_new['std_volume_5'] / df_new['std_volume_30']
    df_new['ratio_std_volume_5_365'] = df_new['std_volume_5'] / df_new['std_volume_365']
    df_new['ratio_std_volume_30_365'] = df_new['std_volume_30'] / df_new['std_volume_365']

def add_return_feature(df, df_new):
    df_new['return_1'] = ((df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1)).shift(1)
    df_new['return_5'] = ((df['Close'] - df['Close'].shift(5)) / df['Close'].shift(5)).shift(1)
    df_new['return_30'] = ((df['Close'] - df['Close'].shift(21)) / df['Close'].shift(21)).shift(1)
    df_new['return_365'] = ((df['Close'] - df['Close'].shift(252)) / df['Close'].shift(252)).shift(1)
    df_new['moving_avg_5'] = df_new['return_1'].rolling(5).mean().shift(1)
    df_new['moving_avg_30'] = df_new['return_1'].rolling(21).mean().shift(1)
    df_new['moving_avg_365'] = df_new['return_1'].rolling(252).mean().shift(1)

def generate_features(df):
    df_new = pd.DataFrame()
    # 6 original features
    add_original_feature(df, df_new)
    # 31 generated features
    add_avg_price(df, df_new)
    add_avg_volume(df, df_new)
    add_std_price(df, df_new)
    add_std_volume(df, df_new)
    add_return_feature(df, df_new)
    # the target
    df_new['close'] = df['Close']
    df_new = df_new.dropna(axis=0)
    return df_new
获取数据并生成特征
import pandas as pd

# 从 Yahoo Finance 下载数据
# 示例链接:https://finance.yahoo.com/quote/%5EDJI/history?period1=1133413200&period2=1134190800&interval=1d&filter=history&frequency=1d
mydata = pd.read_csv('20051201_20051210.csv', index_col='Date')

# 应用特征生成函数
data_raw = pd.read_csv('19880101_20161231.csv', index_col='Date')
data = generate_features(data_raw)

# 查看生成的数据
print(data.round(decimals=3).head(5))

通过以上步骤,我们完成了特征交互在广告点击预测中的应用,以及股票价格预测所需的数据准备工作。接下来,我们将使用这些特征和数据,运用回归算法进行股票价格预测,并评估模型的性能。

总结

本文介绍了特征交互在广告点击预测中的应用,以及如何运用回归算法进行股票价格预测。特征交互能够增强特征信号,提高预测性能。在股票价格预测中,通过特征工程生成的丰富特征为回归算法提供了更有价值的信息。后续我们将进一步探讨各种回归算法的实现和性能评估。

练习
  • 在独热编码解决方案中,能否使用 PySpark 支持的其他分类器(如决策树、随机森林和线性 SVM)代替逻辑回归?
  • 在特征哈希解决方案中,能否尝试其他哈希大小(如 5000 和 20000)?会有什么观察结果?
  • 在特征交互解决方案中,能否尝试其他交互(如 C1 和 C20)?
  • 能否先使用特征交互,然后再使用特征哈希以降低扩展维度?能否获得更高的 AUC?

机器学习中的特征交互与股票价格预测(续)

回归算法在股票价格预测中的应用

在完成股票价格预测所需的数据准备工作后,接下来将详细介绍几种常见的回归算法,并将其应用于股票价格预测中。

线性回归
  • 原理 :线性回归是一种基本的回归算法,它试图通过找到一个线性函数来拟合数据,使得预测值与实际值之间的误差最小。在股票价格预测中,线性回归可以根据我们之前生成的特征来预测股票的收盘价。
  • 实现步骤

    1. 数据划分 :将生成的数据集划分为训练集和测试集。
      ```python
      from sklearn.model_selection import train_test_split

    X = data.drop(‘close’, axis=1)
    y = data[‘close’]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    2. **模型训练**:使用训练集数据训练线性回归模型。 python
    from sklearn.linear_model import LinearRegression

    model = LinearRegression()
    model.fit(X_train, y_train)
    3. **模型预测**:使用训练好的模型对测试集数据进行预测。 python
    y_pred = model.predict(X_test)
    4. **性能评估**:使用评估指标(如均方误差、决定系数等)评估模型的性能。 python
    from sklearn.metrics import mean_squared_error, r2_score

    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f”均方误差: {mse}”)
    print(f”决定系数: {r2}”)
    ```

决策树回归
  • 原理 :决策树回归通过构建决策树来对数据进行划分和预测。每个内部节点是一个特征上的测试,每个分支是测试输出,每个叶节点是一个预测值。
  • 实现步骤

    1. 数据划分 :同线性回归的数据划分步骤。
    2. 模型训练 :使用训练集数据训练决策树回归模型。
      ```python
      from sklearn.tree import DecisionTreeRegressor

    model = DecisionTreeRegressor(random_state=42)
    model.fit(X_train, y_train)
    3. **模型预测**:使用训练好的模型对测试集数据进行预测。 python
    y_pred = model.predict(X_test)
    4. **性能评估**:使用评估指标评估模型的性能。 python
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f”均方误差: {mse}”)
    print(f”决定系数: {r2}”)
    ```

随机森林回归
  • 原理 :随机森林回归是基于决策树的集成学习方法,它通过构建多个决策树并对它们的预测结果进行平均来提高预测的准确性和稳定性。
  • 实现步骤

    1. 数据划分 :同线性回归的数据划分步骤。
    2. 模型训练 :使用训练集数据训练随机森林回归模型。
      ```python
      from sklearn.ensemble import RandomForestRegressor

    model = RandomForestRegressor(random_state=42)
    model.fit(X_train, y_train)
    3. **模型预测**:使用训练好的模型对测试集数据进行预测。 python
    y_pred = model.predict(X_test)
    4. **性能评估**:使用评估指标评估模型的性能。 python
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f”均方误差: {mse}”)
    print(f”决定系数: {r2}”)
    ```

支持向量回归
  • 原理 :支持向量回归通过寻找一个最优的超平面来拟合数据,使得预测值与实际值之间的误差在一定范围内最小。
  • 实现步骤

    1. 数据划分 :同线性回归的数据划分步骤。
    2. 模型训练 :使用训练集数据训练支持向量回归模型。
      ```python
      from sklearn.svm import SVR

    model = SVR()
    model.fit(X_train, y_train)
    3. **模型预测**:使用训练好的模型对测试集数据进行预测。 python
    y_pred = model.predict(X_test)
    4. **性能评估**:使用评估指标评估模型的性能。 python
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f”均方误差: {mse}”)
    print(f”决定系数: {r2}”)
    ```

神经网络回归
  • 原理 :神经网络是一种强大的机器学习模型,它可以自动学习数据中的复杂模式。在股票价格预测中,神经网络可以通过多层神经元的组合来拟合数据。
  • 实现步骤

    1. 数据划分 :同线性回归的数据划分步骤。
    2. 数据预处理 :对数据进行标准化处理,以提高神经网络的训练效果。
      ```python
      from sklearn.preprocessing import StandardScaler

    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    3. **模型构建**:使用 Keras 构建一个简单的神经网络模型。 python
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense

    model = Sequential()
    model.add(Dense(64, activation=’relu’, input_shape=(X_train_scaled.shape[1],)))
    model.add(Dense(32, activation=’relu’))
    model.add(Dense(1))
    model.compile(optimizer=’adam’, loss=’mse’)
    4. **模型训练**:使用训练集数据训练神经网络模型。 python
    model.fit(X_train_scaled, y_train, epochs=50, batch_size=32, validation_split=0.1)
    5. **模型预测**:使用训练好的模型对测试集数据进行预测。 python
    y_pred = model.predict(X_test_scaled)
    6. **性能评估**:使用评估指标评估模型的性能。 python
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f”均方误差: {mse}”)
    print(f”决定系数: {r2}”)
    ```

回归性能评估

在使用不同的回归算法进行股票价格预测后,需要对模型的性能进行评估。常见的评估指标包括:
- 均方误差(Mean Squared Error, MSE) :预测值与实际值之间误差的平方的平均值,MSE 越小,模型的预测性能越好。
- 决定系数(Coefficient of Determination, R²) :表示模型对数据的拟合程度,取值范围为 0 到 1,越接近 1 表示模型拟合效果越好。

以下是一个对比不同回归算法性能的表格:
| 回归算法 | 均方误差 | 决定系数 |
| ---- | ---- | ---- |
| 线性回归 | [具体 MSE 值] | [具体 R² 值] |
| 决策树回归 | [具体 MSE 值] | [具体 R² 值] |
| 随机森林回归 | [具体 MSE 值] | [具体 R² 值] |
| 支持向量回归 | [具体 MSE 值] | [具体 R² 值] |
| 神经网络回归 | [具体 MSE 值] | [具体 R² 值] |

通过对比不同算法的性能指标,我们可以选择最适合股票价格预测的算法。

总结与展望

本文全面介绍了特征交互在广告点击预测中的应用,以及回归算法在股票价格预测中的实现。特征交互通过组合多个特征增强了特征信号,提高了广告点击预测的性能。在股票价格预测方面,我们通过特征工程生成了丰富的特征,并使用多种回归算法进行了预测和性能评估。

然而,股票市场是复杂多变的,受到众多因素的影响,如宏观经济环境、公司财务状况、政策法规等。因此,在实际应用中,我们还需要不断优化模型,结合更多的特征和数据,以提高预测的准确性。同时,也可以尝试使用更复杂的模型和算法,如深度学习中的循环神经网络(RNN)和长短期记忆网络(LSTM),来捕捉股票价格的时间序列特征。

总之,机器学习在股票价格预测领域具有巨大的潜力,但也面临着诸多挑战。通过不断的学习和实践,我们可以更好地利用机器学习技术来解决实际问题。

流程图:股票价格预测流程
graph LR
    A[获取股票数据] --> B[特征工程]
    B --> C[数据划分]
    C --> D[选择回归算法]
    D --> E[模型训练]
    E --> F[模型预测]
    F --> G[性能评估]
    G --> H{是否满意}
    H -- 是 --> I[应用模型]
    H -- 否 --> D

通过这个流程图,我们可以清晰地看到股票价格预测的整个流程,从数据获取到最终的模型应用,每个步骤都紧密相连,相互影响。在实际应用中,我们可以根据性能评估的结果不断调整模型和算法,以达到更好的预测效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值