zoukankan      html  css  js  c++  java
  • 机器学习实战_3_03_IBM股价预测

     一、实战

    print("###############################step1: 导入库###########################################")
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    import keras
    from sklearn.preprocessing import MinMaxScaler
    from keras.models import Sequential
    from keras.layers import Dense, LSTM, Dropout, GRU, Conv2D
    from keras.optimizers import SGD
    
    print("###############################step2: 加载历史数据文件###########################################")
    #dataset1 = pd.read_csv("datasets_8388_11883_IBM_2006-01-01_to_2018-01-01.csv")
    dataset = pd.read_csv("datasets_8388_11883_IBM_2006-01-01_to_2018-01-01.csv",
                          index_col='Date', parse_dates=['Date'])   #以日期为索引,日期列转换为日期格式
    pd.set_option('display.width', 1000)#加了这一行那表格的一行就不会分段出现了
    #print(dataset1.head())
    print(dataset.head())
    print("dataset.shape:  ", dataset.shape)
    print(dataset.describe())
    
    print("**************************************xxxxxxxxxxxx*****************************************")
    train_set = dataset[:'2016'].iloc[:, 0:1].values # 训练集,获取到第一列的数据,
    #train_set = dataset[:'2016'].iloc[:, [0]].values # 训练集,获取到第一列的数据,
    test_set = dataset['2017':].iloc[:, 0:1].values # 测试集,获取到第一列的数据
    #print(train_set)
    print(train_set.shape)
    print(test_set.shape)
    
    print("###############################step3: 定义显示函数###########################################")
    def plot_predictions(test_result, predict_restult):
        """
        test_result: 真实值
        predict_result: 预测值
        """
        plt.plot(test_result, color='red', label='IBM True Stock Price')
        plt.plot(predict_restult, color='blue', label="IMB prdicted Stock Price")
        plt.title("IBM Stock Price")
        plt.xlabel("Time")
        plt.ylabel("Stock Price")
        plt.legend() # 给图加上图例
        plt.show()
    
    print("###############################step4: 绘制训练集和测试集的数据###########################################")
    dataset['High'][:"2016"].plot(figsize=(16, 4), legend=True)
    dataset['High']["2017":].plot(figsize=(16, 4), legend=True)
    plt.title("IBM Stock Price")
    plt.legend(['Train set(before 2016)', 'Test set(after 2017)'])
    #plt.show()
    
    # 正则化:将每一维的特征映射到指定的区间:【0,1】
    sc = MinMaxScaler(feature_range=[0, 1])
    train_set_scaled = sc.fit_transform(train_set)
    
    print("**************************************创建序列数据集(训练和测试)*****************************************")
    # 60个时间步为一个样本,1个输出
    X_train = []
    y_train = []
    for i in range(60, 2769):
        X_train.append(train_set_scaled[i-60:i, 0])  #0表示第0列的数据
        y_train.append(train_set_scaled[i, 0])
    
    X_train, y_train = np.array(X_train), np.array(y_train) # numpy类型变换
    print(X_train.shape)
    print(X_train[0])
    
    # LSTM的输入:(samples, sequence_length, features)
    # reshape: 训练集(2709,60)  ---> (2709, 60, 1)
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
    print(X_train.shape)
    print((X_train.shape[1], 1))
    
    print("###############################step5: 搭建LSTM模型,进行训练和预测###########################################")
    model = tf.keras.models.Sequential(
        tf.keras.layers.LSTM(128, input_shape=(X_train.shape[1], 1))
        # 这里是作为Sequential模型的第一层所以指定input_shape参数,后面加的层不需要这个
        # 这里的input_shape是两个元素的,第一个代表每个输入的样本序列长度,第二个元素代表
        # 每个序列里面的1个元素具有多少个输入数据。例如,LSTM处理的序列长度为10,每个时间
        # 步即序列的元素是由两个维度组成,那么这个参数设置为(10, 2)
        # tf.keras.layers.Dropout(0.2),
        #
        # tf.keras.layers.LSTM(128),
        # tf.keras.layers.Dropout(0.2),
        #
        # tf.keras.layers.LSTM(128),
        # tf.keras.layers.Dropout(0.2),
        #
        # tf.keras.layers.Dense(units=1)
    
    )
    
    
    # model = Sequential()
    # print(model)
    #
    # # LSTM 第一层
    # #model.add(LSTM(128, return_sequences=True, input_shape=(X_train.shape[1], 1)))
    # model.add(Dropout(0.2))
    #
    # # LSTM 第二层
    # model.add(LSTM(128, return_sequences=True))
    # model.add(Dropout(0.2))
    #
    # # LSTM 第三层
    # model.add(LSTM(128))
    # model.add(Dropout(0.2))
    #
    # # Dense层
    # model.add(Dense(units=1))
    
    # 模型编译
    model.compile(optimizer='rmsprop', loss='mse')
    
    # 模型训练
    model.fit(X_train, y_train, epochs=20, batch_size=32)
    print("**************************************打印神经网络结构,统计参数数目*****************************************")
    # 打印神经网络结构,统计参数数目
    model.summary()
    print("**************************************构建数据集进行预测*****************************************")
    dataset_total = pd.concat((dataset['High'][:"2016"], dataset['High']["2017":]), axis=0)
    print(dataset_total.shape)
    print(dataset_total)
    
    inputs = dataset_total[len(train_set):].values
    inputs = inputs.reshape(-1, 1)
    print(inputs.shape)
    inputs_scaled = sc.fit_transform(inputs)
    
    print("**************************************构建测试集X_test,进行估价预测*****************************************")
    dataset_total = pd.concat((dataset['High'][:"2016"], dataset['High']["2017":]), axis=0)
    # 获取输入数据
    inputs = dataset_total[len(dataset_total) - len(test_set) - 60:].values
    print(inputs)
    
    # 归一化
    inputs = inputs.reshape(-1, 1)
    inputs = sc.transform(inputs)
    print(inputs.shape)
    
    # 准备测试集X_test,进行股价预测
    X_test = []
    for i in range(60, 311):
        X_test.append(inputs[i - 60:i, 0])
    
    X_test = np.array(X_test)  # numpy 类型转换
    print(X_test.shape)
    
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
    print(X_test.shape)
    
    predict_test = model.predict(X_test) # 预测
    print(predict_test.shape)
    predict_stock_price = sc.inverse_transform(predict_test)
    print(predict_stock_price)
    print("**************************************绘制测试结果和预测结果*****************************************")
    # 绘制测试结果和预测结果
    plot_predictions(test_set, predict_stock_price)

    说明:

    1.本文为个人学习笔记;

    2.学习视频来源:https://space.bilibili.com/474347248/channel/detail?cid=143235

    3.数据来源:唐国梁Tommy,为了方便志同道合的伙伴一起学习,我将数据上传到个人盘分享:

    链接:https://pan.baidu.com/s/1t0SiTHtcn8BhgM92jYjArA
    提取码:g836

    4.本文代码运行环境基于pycharm.(原代码是基于jupyter实现的);

    5.代码的一些注释是为了理解,不太标准规范化,但不影响功能实现;

    5.欢迎一起讨论学习:386825951@qq.com

  • 相关阅读:
    Asp.Net.Core 5 传值 (控制器->界面)
    Asp.Net Core5创建项目
    .Net5 环境搭建准备
    git拉子分支代码
    【给每个人的摄影史22】国家地理硬照之外的风景:“新地形”摄影,新在哪?
    【给每个人的摄影史21】国家地理硬照之外的风景:风景摄影的三条路
    【给每个人的摄影史20】全球最贵的照片是在欺骗观众?:杜塞尔多夫学派的实践者
    【给每个人的摄影史19】全球最贵的照片是在欺骗观众?:杜塞尔多夫学派和贝歇夫妇
    【给每个人的摄影史18】全球最贵的照片是在欺骗观众?:从《莱茵河II》说起
    【给每个人的摄影史17】为彩色照片正名:当代彩色摄影的实践者们
  • 原文地址:https://www.cnblogs.com/bltstop/p/14816933.html
Copyright © 2011-2022 走看看