Data mining-资金流入流出预测(一)

介绍

此数据挖掘项目基于阿里云天池赛题:赛题链接
参考github项目进行学习:github项目链接

赛题简介

具体的赛题介绍可去官网查看,这里只简单总结一下。官方提供了2013年7月~2014年8月28041位用户余额宝的申购赎回信息,我们需要通过数据挖掘的手段从这些数据中挖掘出有效信息,并预测2014年9月的每一天申购和赎回的总量。
理解了大概是个什么任务之后,我们的目标就很明确,要尽可能提高预测精度。

数据准备与探索

这是数据挖掘的第一步,我们需要整理好我们的数据,并做一些简单的分析。大概有以下三个步骤:
1. 时间序列图
2. 数据分布可视化
3. 数据的相关性及独立性分析

时间序列图

这个很好理解,通过时间序列图可以很好的看到我们要观察的数据的趋势。
在python中,我们有很好的封装库画出时间序列图。比如,matplotlib,seaborn。而Seaborn其实是在matplotlib的基础上进行了更高级的API封装,使得作图更加的简单,漂亮。因为是时间序列图,有需要的话还可以借助datatime库构造时间戳。

数据分布可视化

主要还是用到上面提到的库。这里简单介绍一下会用到一些的图。除了常见的直方图,密度曲线图之外。还有箱型图,小提琴图。

箱型图

箱型图包含五个要素,分别是上限,上四分位数,中位数,下四分位数,下限。其中上四分位数是指 把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。同理,那么下四分位数就是处于第一个分割点位置的数值。而第二个分割点显然就是中位数。这三个分割点也可以记做Q1,Q2,Q3。
在这里插入图片描述
确定四分位数有两种方法,分别是基于(N+1)的方法, 一种是基于(N-1)的方法。这里举一个用N+1计算四分数的例子:

数据一共有六项: 7, 15, 36, 39, 40, 83。
1*(n+1)/4= 7/4 =1.75,Q1在第一与第二个数字之间,  
2*(n+1)/4 = 3.5 Q2在第三个和第四个数字中间,
3*(n+1)/4= 21/4 =5.25, Q3在第五与第六个数字之间,
  所以:
Q1 = 0.75 *15+0.25 7 = 13,
Q2 = (36+39)/2= 37.5,
Q3 = 0.25
41+0.75 *40 = 40.25.
四分位距IQR=Q3-Q1 = 27.25,
那么上限=Q3+1.5IQR = 81.125
下限 = Q1-1.5IQR = -27.875
那么不在上限与下限之间的数被称之为异常值

最后,总结一下就是,箱型图是是一种显示一组数据分散情况的统计图。

小提琴图

在这里插入图片描述

关于小提琴图可以这样简单理解,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。

而关于95%置信区间的介绍,这篇回答很不错。95%置信区间的理解

变量间的相关性与独立性分析

首先我们需要了解一下在统计学上有以下几种变量

  1. 定类变量 Norminal Data 可以分类 ( = 和 ≠ )

  2. 定序变量 Ordinal Data:可以分类( = 和 ≠ ),可以排序(> 和 <),但不能(+ 和 - )
    例如文化程度可以分为大学、高中、初中、小学、文盲

  3. 定距变量 Interval Data :可以分类( = 和 ≠ ),可以排序(> 和 <),可以(+ 和 - )
    注意:定距变量没有绝对零点。例如华氏温度:10,20,30,华氏度40不是20的两倍热

相关性分析

对于不同变量之间的相关性分析有以下方法。
在这里插入图片描述

变量的独立性检验

占个坑,之后填。

代码实战

官方提供了五张表,分别是:用户信息表( user_profile_t

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资金流入流出预测是一个时间序列预测问题,可以使用LSTM(长短期记忆网络)进行建模。LSTM是一种递归神经网络,可以处理和预测时间序列数据。以下是使用LSTM进行资金流入流出预测的步骤: 1. 数据预处理:将原始数据转换为适合LSTM模型的格式,包括将时间序列数据转换为监督学习问题、归一化数据等。 2. 构建LSTM模型:LSTM模型由输入层、隐藏层和输出层组成。输入层接收时间序列数据,隐藏层通过记忆单元和门控单元来处理序列数据,输出层将隐藏层的输出转换为预测结果。 3. 训练模型:使用训练数据对LSTM模型进行训练,并调整模型参数以提高预测准确率。 4. 预测未来资金流入流出:使用训练好的LSTM模型对未来资金流入流出进行预测。 以下是使用Python和Keras库实现资金流入流出预测代码示例: ```python # 导入必要的库 import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, LSTM from sklearn.preprocessing import MinMaxScaler # 读取数据 user_balance_table = pd.read_csv('user_balance_table.csv') # 数据预处理 def prepare_data(data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] df = pd.DataFrame(data) cols, names = list(), list() # 输入序列 (t-n, ... t-1) for i in range(n_in, 0, -1): cols.append(df.shift(i)) names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)] # 输出序列 (t, t+1, ... t+n) for i in range(0, n_out): cols.append(df.shift(-i)) if i == 0: names += [('var%d(t)' % (j+1)) for j in range(n_vars)] else: names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)] # 合并序列 agg = pd.concat(cols, axis=1) agg.columns = names # 删除缺失值行 if dropnan: agg.dropna(inplace=True) return agg # 归一化数据 scaler = MinMaxScaler(feature_range=(0, 1)) scaled = scaler.fit_transform(user_balance_table) # 构建监督学习问题 reframed = prepare_data(scaled, 1, 1) # 分割训练集和测试集 values = reframed.values n_train_days = 600 train = values[:n_train_days, :] test = values[n_train_days:, :] train_X, train_y = train[:, :-1], train[:, -1] test_X, test_y = test[:, :-1], test[:, -1] train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1])) test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1])) # 构建LSTM模型 model = Sequential() model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2]))) model.add(Dense(1)) model.compile(loss='mae', optimizer='adam') # 训练模型 history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False) # 预测未来资金流入流出 yhat = model.predict(test_X) test_X = test_X.reshape((test_X.shape[0], test_X.shape[2])) # 反归一化预测结果 inv_yhat = np.concatenate((yhat, test_X[:, 1:]), axis=1) inv_yhat = scaler.inverse_transform(inv_yhat) inv_yhat = inv_yhat[:,0] # 反归一化真实结果 test_y = test_y.reshape((len(test_y), 1)) inv_y = np.concatenate((test_y, test_X[:, 1:]), axis=1) inv_y = scaler.inverse_transform(inv_y) inv_y = inv_y[:,0] # 输出预测结果和真实结果 for i in range(len(inv_y)): print('Predicted: %.2f, Actual: %.2f' % (inv_yhat[i], inv_y[i])) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值