Django及keras中的LSTM

1.keras中的LSTM

最近在做光伏功率预测的项目时需要用到keras中的LSTM函数,本文对LSTM中的参数做个记录。

keras.layers.LSTM 类中有两个常用但不容易理解的参数,分别是 return_sequencesreturn_state。对于两个参数,官方定义如下:

  • return_sequences: 布尔值。是返回输出序列中的最后一个输出,还是全部序列。
  • return_state: 布尔值。除了输出之外是否返回最后一个状态。

keras.layers.LSTM 默认 return_sequences=Falsereturn_state=False。此时只会返回最终ht值。LSTM中的参数units代表转化后输出outputs的维数,不是cell的个数,可以理解为训练参数W的维数,经过转化将输入转化为固定的维数。Keras中RepeatVector相当于将输出重复多次,将一个2D的向量转化为3D的向量。下面举一个栗子:

1
2
3
4
Sentence01: you are really a genius
model = Sequential()
model.add(LSTM(128, input_dim=64, input_length=5, return_sequences=True))
model.add(LSTM(256, return_sequences=False))

(1)我们把输入的单词,转换为维度64的词向量,小矩形的数目即单词的个数input_length ; (2)通过第一个LSTM中的Y=XW,这里输入为维度64,输出为维度128,而return_sequences=True,我们可以获得5个128维的词向量V1’..V5’ ; (3)通过第二个LSTM,此时输入为V1’..V5’都为128维,经转换后得到V1”..V5”为256维,最后因为return_sequences=False,所以只输出了最后一个红色的词向量 V5”。

2.django

在做项目时,最好与github同步,与github同步的办法是:可以先在github上建立一个存储库,例如在github上创建一个demo库,然后在终端执行下述命令:

git clone https://github.com/zdhwg/demo.git

然后本地文件中就有了demo文件夹,在此文件夹中进行编码。在此文件夹下创建一个test文件夹,用于存放项目文件,然后进入到该文件,并在该目录中启动Django项目,命名为server。

mkdir test
cd test
django-admin startproject server

另外可以用django-admin查看所有的django命令。用以下命令来初始化服务器,在web浏览器中输入127.0.0.1:8000时,可以看到django默认的欢迎站点。

cd server
python manage.py runserver

经过一些列上面的操作,已经修改了原文件夹下的文件,下面提交一下新的文件:

git add test/ ###也可以用git add .将全部的更改都记录下来
git commint -m "setup django project"
git push

3.简单机器学习算法

第一步是加载库,重点是joblib保存模型的使用,另外pickle也可以完成类似的功能,在Python中,如果希望透明地存储对象,而不丢失其身份和类型等信息,则需要某种形式的对象序列化,这是一个将任意复杂的对象转成对象的文本和二进制表示的过程。

1
2
3
4
5
6
7
8
import json # will be needed for saving preprocessing details
import numpy as np # for data manipulation
import pandas as pd # for data manipulation
from sklearn.model_selection import train_test_split # will be used for data split
from sklearn.preprocessing import LabelEncoder # for preprocessing
from sklearn.ensemble import RandomForestClassifier # for training the algorithm
from sklearn.ensemble import ExtraTreesClassifier # for training the algorithm
from sklearn.externals import joblib # for saving algorithm and preprocessing objects

数据采用Adult Income数据集。在这个数据集中,ML将被用来根据人口普查数据预测收入是否超过每年5万美元。

1
2
3
4
5
6
7
8
9
# load dataset
df = pd.read_csv('https://raw.githubusercontent.com/pplonski/datasets-for-start/master/adult/data.csv', skipinitialspace=True)
#skipinitialspace : boolean, default False忽略分隔符后的空白(默认为False,即不忽略).
x_cols = [c for c in df.columns if c != 'income']
# set input matrix and target column
X = df[x_cols]
y = df['income']
# show first rows of data
df.head()

X矩阵有32561行14列,这是我们算法的输入数据,每一行描述一个人。y向量有32561个值,表示年收入是否超过5万每年。在开始数据预处理之前,我们将把数据分成训练和测试子集。我们将使用30%的数据进行测试。

1
2
# data split train / test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=1234)

在应用机器学习算法前,首先进行数据预处理。对于此数据集,主要分为数据的缺失值处理和类别数据的处理。数据缺失值的处理这里采用用最频繁的值填充(还用许多其他的填充方式)。

1
2
3
4
# fill missing values
train_mode = dict(X_train.mode().iloc[0])
X_train = X_train.fillna(train_mode)
print(train_mode)

train_mode中保存了每一列最频繁的值。然后将数据中的类别进行编号:

1
2
3
4
5
6
7
8
# convert categoricals
encoders = {}
for column in ['workclass', 'education', 'marital-status',
                'occupation', 'relationship', 'race',
                'sex','native-country']:
    categorical_convert = LabelEncoder()
    X_train[column] = categorical_convert.fit_transform(X_train[column])
    encoders[column] = categorical_convert

encoders中保存了每一个列下的编号类型,当有新数据进来时,加载encoders即可保证在训练集和测试集中的编码类型一样。数据预处理后,下面进行机器学习算法,

1
2
3
# train the Random Forest algorithm
rf = RandomForestClassifier(n_estimators = 100)
rf = rf.fit(X_train, y_train)

在训练一个Extra Trees:

1
2
3
# train the Extra Trees algorithm
et = ExtraTreesClassifier(n_estimators = 100)
et = et.fit(X_train, y_train)

下面要保存我们创建的算法。需要注意的重要一点是,ML算法不仅是rf和et变量(带有模型权值),我们还需要保存预处理变量train_mode和encoders。为了保存,将使用joblib包。

1
2
3
4
5
# save preprocessing objects and RF algorithm
joblib.dump(train_mode, "./train_mode.joblib", compress=True)
joblib.dump(encoders, "./encoders.joblib", compress=True)
joblib.dump(rf, "./random_forest.joblib", compress=True)
joblib.dump(et, "./extra_trees.joblib", compress=True)

新建一个ml文件,将所有的代码文件放在里面,然后同步到github。

git add research/*
git commit -am "add ML code and algorithms"
git push

到目前为止已经初始化了默认的django项目和训练好了两个ML算法,下面将ML算法部署到django框架上,并编 使用Django REST框架为ML算法编写REST API。

为了创建Django模型,我们需要创建一个新的app(endpoints):

# run this in test/server directory
python manage.py startapp endpoints
mkdir apps
mv endpoints/ apps/###mv命令为linux系统使用,在windows相当于剪切粘贴。

使用上述命令,我们创建了endpoints应用程序并将其移动到apps目录。我已经添加了apps目录来保持项目的整洁。