精华内容
下载资源
问答
  • 一半模型的定义
    千次阅读
    2020-03-06 23:27:23

    模型的保存方法

    第一步:实例化

    在会话的前面

    # 添加一个saver保存模型!!!!!!!!!!!!!!
    saver = tf.train.Saver()#实例化
    

    第二步:模型的保存

    saver.save(sess, "./summary/ckpt/linear/linear_regression.ckpt")
    

    案例

    import tensorflow as tf
    
    with tf.variable_scope("lr_model"):
        def linear_regression():#定义名字
            # 1)准备好数据集:y = 0.8x + 0.7 100个样本
            # 特征值X, 目标值y_true
            with tf.variable_scope("original_data"):#定义名字
                X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
                # y_true [100, 1]
                # 矩阵运算 X(100, 1)* (1, 1)= y_true(100, 1)
                y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
    
            # 2)建立线性模型:
            # y = W·X + b,目标:求出权重W和偏置b
            # 3)随机初始化W1和b1
    
            with tf.variable_scope("linear_model"):#定义名字
                weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
                bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
                y_predict = tf.matmul(X, weights, name="model_matmul") + bias
    
            # 4)确定损失函数(预测值与真实值之间的误差)-均方误差
            with tf.variable_scope("loss"):#定义名字
                error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
    
            # 5)梯度下降优化损失:需要指定学习率(超参数)
            # W2 = W1 - 学习率*(方向)
            # b2 = b1 - 学习率*(方向)
            with tf.variable_scope("gd_optimizer"):#定义名字
                optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
    
            # 2)收集变量
            tf.summary.scalar("error", error)##生成准确率标量图
            tf.summary.histogram("weights", weights)#用来显示直方图信息
            tf.summary.histogram("bias", bias)#用来显示直方图信息
    
            # 3)合并变量
            merge = tf.summary.merge_all()
    
            # 添加一个saver保存模型!!!!!!!!!!!!!!
            saver = tf.train.Saver()#实例化
    
            # 初始化变量
            init = tf.global_variables_initializer()
            # 开启会话进行训练
            with tf.Session() as sess:
                # 运行初始化变量Op
                sess.run(init)
                print("随机初始化的权重为%f, 偏置为%f" % (weights.eval(), bias.eval()))
                # 1)创建事件文件【重要】
                file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
                # 训练模型
                for i in range(3000):
                    sess.run(optimizer)
                    print("第%d步的误差为%f,权重为%f, 偏置为%f" % (i, error.eval(), weights.eval(), bias.eval()))
                    # 4)运行合并变量op
                    summary = sess.run(merge)
                    file_writer.add_summary(summary, i)#i保留每一次的数量
                    # 训练过程比较长,保存一下,只会保存最近的五个!!!!!!!!
                    saver.save(sess, "./summary/ckpt/linear/linear_regression.ckpt")
    
    
    
    
    if __name__ == '__main__':
        linear_regression()
    
    

    在这里插入图片描述

    训练了一半的模型继续训练

    情景:我们之前已经训练了3000步了,保存了,但是结果不是很满意,想要继续在3000的基础上训练

    第一步:加载之前的模型

    在训练之前

    #加载历史模型
    saver.restore(sess, "./summary/ckpt/linear/linear_regression.ckpt")
    

    案例

    import tensorflow as tf
    
    with tf.variable_scope("lr_model"):
        def linear_regression():#定义名字
            # 1)准备好数据集:y = 0.8x + 0.7 100个样本
            # 特征值X, 目标值y_true
            with tf.variable_scope("original_data"):#定义名字
                X = tf.random_normal(shape=(100, 1), mean=2, stddev=2, name="original_data_x")
                # y_true [100, 1]
                # 矩阵运算 X(100, 1)* (1, 1)= y_true(100, 1)
                y_true = tf.matmul(X, [[0.8]], name="original_matmul") + 0.7
    
            # 2)建立线性模型:
            # y = W·X + b,目标:求出权重W和偏置b
            # 3)随机初始化W1和b1
    
            with tf.variable_scope("linear_model"):#定义名字
                weights = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="weights")
                bias = tf.Variable(initial_value=tf.random_normal(shape=(1, 1)), name="bias")
                y_predict = tf.matmul(X, weights, name="model_matmul") + bias
    
            # 4)确定损失函数(预测值与真实值之间的误差)-均方误差
            with tf.variable_scope("loss"):#定义名字
                error = tf.reduce_mean(tf.square(y_predict - y_true), name="error_op")
    
            # 5)梯度下降优化损失:需要指定学习率(超参数)
            # W2 = W1 - 学习率*(方向)
            # b2 = b1 - 学习率*(方向)
            with tf.variable_scope("gd_optimizer"):#定义名字
                optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01, name="optimizer").minimize(error)
    
            # 2)收集变量
            tf.summary.scalar("error", error)##生成准确率标量图
            tf.summary.histogram("weights", weights)#用来显示直方图信息
            tf.summary.histogram("bias", bias)#用来显示直方图信息
    
            # 3)合并变量
            merge = tf.summary.merge_all()
    
            # 添加一个saver保存模型!!!!!!!!!!!!!!
            saver = tf.train.Saver()#实例化
    
            # 初始化变量
            init = tf.global_variables_initializer()
            # 开启会话进行训练
            with tf.Session() as sess:
                # 运行初始化变量Op
                sess.run(init)
                print("随机初始化的权重为%f, 偏置为%f" % (weights.eval(), bias.eval()))
                # 第2999步的误差为0  .000000,权重为0 .799999, 偏置为0 .700002
                # 1)创建事件文件【重要】
                file_writer = tf.summary.FileWriter(logdir="./summary", graph=sess.graph)
    
                #加载历史模型
                saver.restore(sess, "./summary/ckpt/linear/linear_regression.ckpt")
    
                # 训练模型
                for i in range(1000):
                    sess.run(optimizer)
                    print("第%d步的误差为%f,权重为%f, 偏置为%f" % (i, error.eval(), weights.eval(), bias.eval()))
                    # 4)运行合并变量op
                    summary = sess.run(merge)
                    file_writer.add_summary(summary, i)#i保留每一次的数量
                    # 训练过程比较长,保存一下,只会保存最近的五个!!!!!!!!
                    saver.save(sess, "./summary/ckpt/linear/linear_regression.ckpt2")
    
    
    
    
    if __name__ == '__main__':
        linear_regression()
    
    

    在这里插入图片描述

    更多相关内容
  • 使用Flask部署机器学习模型

    千次阅读 2020-07-09 16:57:53
    部署机器学习模型是每个ML项目的一个关键 学习如何使用Flask将机器学习模型部署到生产中 模型部署是数据科学家访谈中的一个核心话题 介绍 我记得我早期在机器学习领域的日子。我喜欢处理多个问题,对机器学习...

    作者|LAKSHAY ARORA 编译|VK 来源|Analytics Vidhya

    概述

    • 部署机器学习模型是每个ML项目的一个关键

    • 学习如何使用Flask将机器学习模型部署到生产中

    • 模型部署是数据科学家访谈中的一个核心话题

    介绍

    我记得我早期在机器学习领域的日子。我喜欢处理多个问题,对机器学习项目的各个阶段都很感兴趣。和我之前的许多人一样,我被模型整个生命周期的构建所吸引。

    我和领域专家谈过,项目经理和所有相关人员确保他们的投入被包括在模型中。但后来我遇到了一个障碍——我到底该如何把我的模型交给我的客户呢?我不能给他们一个Jupyter notebook!

    我所学的一切都集中在模型构建组件上。没有多少人会谈论如何部署你的机器学习模型。把你的模型投入生产意味着什么?它需要什么?

    这些都是每个数据科学家需要回答的关键的职业定义问题。这就是为什么我决定写下这个教程来演示如何使用Flask来部署机器学习模型。

    我们将首先了解模型部署的概念,然后讨论Flask是什么,如何安装它,最后,我们将深入到一个问题陈述中,学习如何使用Flask部署机器学习模型。

    目录

    1. 什么是模型部署?

    2. 什么是Flask?

    3. 在机器上安装Flask

    4. 理解问题陈述

    5. 建立我们的机器学习模型

    6. 设置Twitter API

    7. 创建网页

    8. 将网页与模型连接

    9. 查看部署模型

    什么是模型部署?

    在典型的机器学习和深度学习项目中,我们通常从定义问题陈述开始,然后是数据收集和准备、数据理解和模型构建,对吧?

    但是,最后,我们希望我们的模型能够提供给最终用户,以便他们能够利用它。模型部署是任何机器学习项目的最后阶段之一,可能有点棘手。如何将机器学习模型传递给客户/利益相关者?当你的模型投入生产时,你需要注意哪些不同的事情?你怎么能开始部署一个模型呢?

    Flask的作用来了。

    什么是Flask?

    Flask是一个用Python编写的web应用程序框架。它有多个模块,使web开发人员更容易编写应用程序,而不必担心协议管理、线程管理等细节。

    Flask是开发web应用程序的选择之一,它为我们提供了构建web应用程序所必需的工具和库。

    在本教程中,我们将利用Flask的资源来帮助我们部署自己的机器学习模型。你会喜欢用Flask工作的!

    在机器上安装Flask

    安装Flask简单明了。在这里,我假设你已经安装了Python 3和pip。要安装Flask,需要运行以下命令:

    sudo apt-get install python3-flask

    就这样!准备好深入到问题陈述中去,离部署机器学习模型更近一步。

    理解问题陈述

    在本节中,我们将使用Twitter数据集。我们的目标是在推特上发现仇恨言论。为了简单起见,如果推特带有种族主义或性别歧视情绪,我们说它包含仇恨言论。

    我们将创建一个包含如下文本框的网页(用户可以搜索任何文本):

    对于任何搜索查询,我们将实时抓取与该文本相关的tweet,对于所有这些被抓取的tweet,我们将使用仇恨言语检测模型对种族主义和性别歧视tweet进行分类。

    设置项目工作流

    1. 模型构建:我们将建立一个逻辑回归模型管道来分类tweet是否包含仇恨言论。在这里,我们的重点不是如何建立一个非常精确的分类模型,而是看看如何使用Flask部署这个模型
    2. 安装Twitter应用程序:我们将在Twitter开发人员的网站上创建一个Twitter应用程序,并获取身份验证密钥。我们将编写一个Python脚本来抓取与特定文本查询相关的tweet
    3. 网页模板:在这里,我们将设计一个用户界面,用户可以提交他的查询
    4. 获取Tweets:从用户处获取查询后,我们将使用twitter API获取与所搜索查询相关的Tweets
    5. 预测类并发送结果:接下来,使用保存的模型预测tweets的类并将结果发送回网页

    下面是我们刚才看到的步骤的示意图:

    建立我们的机器学习模型

    我们在映射到标签的CSV文件中有关于Tweets的数据。我们将使用logistic回归模型来预测tweet是否包含仇恨言论。

    你可以在这里下载完整的代码和数据集。

    https://github.com/lakshay-arora/Hate-Speech-Classification-deployed-using-Flask/tree/master

    首先导入一些必需的库:

    # 导入必需的库
    import pandas as pd
    from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS, TfidfVectorizer
    from sklearn.linear_model import LogisticRegression
    from sklearn.pipeline import Pipeline
    from sklearn.metrics import f1_score
    from sklearn.model_selection import train_test_split

    接下来,我们将读取数据集并查看顶行:

    # 读取数据集
    data = pd.read_csv('dataset/twitter_sentiments.csv')
    # 查看顶行
    data.head()

    数据集有31962行和3列:

    1. id:每行的唯一编号
    2. label:对于正常的tweet,它是0;对于种族主义或性别歧视的tweet,它将是1。有29720个0和2242个1
    3. tweet:在Twitter上发布的tweet

    现在,我们将使用scikit learn的train_test_split函数将数据分为训练和测试。我们只将20%的数据用于测试。我们将对标签列上的数据进行分层抽样,以便目标标签在训练和测试数据中的分布相同:

    # 分为训练集和测试集
    train, test = train_test_split(data, test_size = 0.2, stratify = data['label'], random_state=21)
    
    # 获取大小
    train.shape, test.shape
    ## >> ((25569, 3), (6393, 3))

    现在,我们将使用TfidfVectorizer 创建tweet列的TF-IDF向量,并将参数lowercase设为True,以便它首先将文本转换为小写。我们还将保持max features为1000,并传递scikit learn 库中预定义的停用词列表。

    首先,创建TFidfVectorizer的对象,构建模型并将模型与训练数据tweets匹配:

    # 创建TfidfVectorizer对象
    tfidf_vectorizer = TfidfVectorizer(lowercase= True, max_features=1000, stop_words=ENGLISH_STOP_WORDS)
    
    # 拟合模型
    tfidf_vectorizer.fit(train.tweet)

    利用模型对训练和测试数据的推文进行变换:

    # #转换训练和测试数据
    train_idf = tfidf_vectorizer.transform(train.tweet)
    test_idf  = tfidf_vectorizer.transform(test.tweet)

    现在,我们将创建一个Logistic回归模型的对象。

    请记住,我们的重点不是建立一个非常精确的分类模型,而是看我们如何部署这个预测模型来获得结果。

    # 创建线性回归模型的对象
    model_LR = LogisticRegression()
    
    # 用训练数据拟合模型
    model_LR.fit(train_idf, train.label)
    
    # 预测训练数据的标签
    predict_train = model_LR.predict(train_idf)
    
    # 在测试数据预测模型
    predict_test = model_LR.predict(test_idf)
    
    # f1得分
    f1_score(y_true= train.label, y_pred= predict_train)
    ## >> 0.4888178913738019
    
    f1_score(y_true= test.label, y_pred= predict_test)
    ## >> 0.45751633986928114

    让我们定义管道的步骤:

    1. 步骤1:创建一个tweet文本的TF-IDF向量,其中包含上面定义的1000个特征

    2. 步骤2:使用逻辑回归模型预测目标标签

    当我们对管道对象使用fit()函数时,这两个步骤都会执行。在模型训练过程之后,我们使用predict())函数来生成预测。

    # 定义管道的阶段
    pipeline = Pipeline(steps= [('tfidf', TfidfVectorizer(lowercase=True,
                                                          max_features=1000,
                                                          stop_words= ENGLISH_STOP_WORDS)),
                                ('model', LogisticRegression())])
    
    # 用训练数据拟合管道模型                          
    pipeline.fit(train.tweet, train.label)

    现在,我们将使用一个示例tweet测试管道:

    # 示例tweet
    text = ["Virat Kohli, AB de Villiers set to auction their 'Green Day' kits from 2016 IPL match to raise funds"]
    
    # 使用管道预测标签
    pipeline.predict(text)
    ## >> array([0])

    我们已经成功地构建了机器学习管道,我们将使用joblib库中的dump函数保存这个管道对象。只需传递管道对象和文件名:

    # 导入joblib
    from joblib import dump
    
    # 保存管道模型
    dump(pipeline, filename="text_classification.joblib")

    它将创建一个文件“text_classification.joblib“. 现在,我们将打开另一个Python文件,并使用joblib库的load函数来加载管道模型。

    让我们看看如何使用保存的模型:

    # 导入joblib
    from joblib import load
    
    # tweet文本示例
    text = ["Virat Kohli, AB de Villiers set to auction their 'Green Day' kits from 2016 IPL match to raise funds"]
    
    # 加载保存的pipleine模型
    pipeline = load("text_classification.joblib")
    
    # 对tweet文本样本的预测
    pipeline.predict(text)
    ## >> array([0])

    设置Twitter API

    我们需要做的第一件事是从Twitter开发人员网站获取API key, API secret key, access tokenaccess token secret。这些密钥将帮助API进行身份验证。首先,转到这一页并填写表格。

    https://developer.twitter.com/en/apps/create

    一旦你填好表格,你就会拿到key。

    安装tweepy

    现在,我们将安装tweepy,它是一个Python库,允许我们访问Twitter API。

    !pip3 install tweepy

    导入所需的库并添加从Twitter接收到的身份验证密钥。Tweepy试图使身份验证对你来说尽可能无痛。

    要开始这个过程,需要创建OAuthHandler实例并传递API keyAPI secret key。然后使用access tokenaccess token secret对实例进行身份验证。

    # 导入所需库
    import tweepy
    import time
    import pandas as pd
    pd.set_option('display.max_colwidth', 1000)
    
    # api key
    api_key = "Enter API Key Here"
    # api secret key
    api_secret_key = "Enter API Secret Key Here."
    # access token
    access_token = "Enter Access Token Here"
    # access token secret
    access_token_secret = "Enter Access Token Secret Here."
    
    # 授权API Key
    authentication = tweepy.OAuthHandler(api_key, api_secret_key)
    
    #对用户access token和access token secret授权
    authentication.set_access_token(access_token, access_token_secret)
    
    # 调用api
    api = tweepy.API(authentication, wait_on_rate_limit=True)

    接下来,我们将定义一个函数“get_related_tweets”,它将接受参数text_query并返回与该特定文本查询相关的50条tweets。我们将使用搜索API从Twitter获取结果。

    搜索API的一些参数是:

    • q–最多500个字符的搜索查询字符串
    • geocode–返回位于给定纬度/经度的给定半径内的用户的tweets
    • lang–将tweets限制为给定的语言,由ISO 639-1代码给出
    • result_type–指定希望接收的搜索结果类型。当前默认值为“mixed”。有效值包括:
      • mixed:返回包含流行和实时结果
      • recent:仅返回最近的结果
      • popular:只返回最流行的结果
    • count–每页尝试检索的结果数。一次最多可以请求100条tweets
    • max_id–仅返回id小于(即早于)或等于指定id的状态。使用此选项,可以自动获取大量唯一的tweets

    我们将为给定的文本查询请求50条tweet以及tweet创建时间、tweet id和tweet文本,函数将返回所有tweet的数据帧:

    def get_related_tweets(text_query):
        # 存储推文的列表
        tweets_list = []
        # 推特数量
        count = 50
        try:
            # 从查询中提取单个tweets
            for tweet in api.search(q=text_query, count=count):
                print(tweet.text)
                # 添加到包含所有tweets的列表
                tweets_list.append({'created_at': tweet.created_at,
                                    'tweet_id': tweet.id,
                                    'tweet_text': tweet.text})
            return pd.DataFrame.from_dict(tweets_list)
    
        except BaseException as e:
            print('failed on_status,', str(e))
            time.sleep(3)

    创建网页

    在这里,我们将创建一个类似于以下内容的网页:

    它将有一个文本框,用户可以在其中键入文本查询,然后单击“搜索”按钮以获取搜索文本查询的结果。

    我们需要添加表单标记来收集搜索容器中的数据,在表单标记中,我们将方法post和name作为“search”传递。通过提供这个方法,我们的后端代码将能够知道我们已经收到了一些名为“search”的数据,在后端,我们需要处理这些数据并发送一些数据。

    这只是HTML文件的一部分。你可以在此处下载完整的代码和与此项目相关的其他文件。

    https://github.com/lakshay-arora/Hate-Speech-Classification-deployed-using-Flask/tree/master

    将网页与模型连接

    我们已经完成了前端部分,现在我们连接模型和网页。第一步是加载保存的管道模型,我们将定义一个函数requestResults,该函数将获取所请求查询的tweets,并使用管道获取标签并返回要发送的最终结果。

    # 导入所需库
    from flask import Flask, render_template, request, redirect, url_for
    from joblib import load
    from get_tweets import get_related_tweets
    
    # 加载管道对象
    pipeline = load("text_classification.joblib")
    
    # 获取特定文本查询的结果
    def requestResults(name):
        # 获取推特文本
        tweets = get_related_tweets(name)
        # 获取预测
        tweets['prediction'] = pipeline.predict(tweets['tweet_text'])
        # 获取预测的不同标签的值计数
        data = str(tweets.prediction.value_counts()) + '\n\n'
        return data + str(tweets)

    现在,首先,创建Flask类的一个对象,该对象将以当前模块名作为参数。route函数将告诉Flask应用程序下一步要在网页上呈现哪个URL。

    当Flask服务器运行时,Flask应用程序将路由到默认URL路径并调用home函数,它将呈现home.html文件。

    现在,每当有人发送文本查询时,Flask将检测post方法并调用get_data函数,在这里我们将使用名称搜索获取表单数据,然后重定向到success函数。

    最后,success函数将使用requestResults函数获取数据并将其发送回网页。

    # 启动flask
    app = Flask(__name__)
    
    # 渲染网页
    @app.route('/')
    def home():
        return render_template('home.html')
    
    # 当post方法检测到时,则重定向到success函数
    @app.route('/', methods=['POST', 'GET'])
    def get_data():
        if request.method == 'POST':
            user = request.form['search']
            return redirect(url_for('success', name=user))
    
    # 获取请求查询的数据
    @app.route('/success/<name>')
    def success(name):
        return "<xmp>" + str(requestResults(name)) + " </xmp> "

    现在,调用run函数启动Flask服务器:

    app.run(debug=True)

    查看部署模型

    我们已成功启动Flask服务器!打开浏览器并转到此地址-http://127.0.0.1:5000/。你将看到Flask服务器已呈现默认模板。现在搜索任何查询,如iplt20:

    Flask服务器将接收与iplt20相关的数据和新tweets请求,并使用该模型预测标签并返回结果。

    令人惊叹!在这里,在50条推文中,我们的模型预测了3条包含仇恨言论的推文。我们可以添加更多的功能,比如请求来自某个国家的推文。

    结尾

    这就是使用Flask执行模型部署的方法!部署机器学习模型听起来可能是一项复杂而繁重的任务,但是一旦你了解了它是什么以及它是如何工作的,你就已经完成了一半。

    原文链接:https://www.analyticsvidhya.com/blog/2020/04/how-to-deploy-machine-learning-model-flask/

    欢迎关注磐创AI博客站: http://panchuang.net/

    sklearn机器学习中文官方文档: http://sklearn123.com/

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/

    展开全文
  • 运行环境:Matlab ...今天和大家分享数学建模重要模型——马尔可夫链模型。在对数学建模之马尔可夫链模型进行介绍时,首先需要明确两个问题: 马氏链模型用来干什么 马尔可夫预测法是应用概率论中马尔可夫链(Mar

    目前持续更新的专栏:

    大家好,我是左手の明天!

    今天和大家分享数学建模重要模型——马尔可夫链模型。在对数学建模之马尔可夫链模型进行介绍时,首先需要明确两个问题:

    马氏链模型用来干什么

    马尔可夫预测法是应用概率论中马尔可夫链(Markov chain)的理论和方法来研究分析时间序列的变化规律,并由此预测其未来变化趋势的一种预测技术。

    马氏链模型什么时候用
    应用马尔可夫链的计算方法进行马尔可夫分析, 主要目的是根据某些变量现在的情况及其变动趋向,来预测它在未来某特定区间可能产生的变动,作为提供某种决策的依据。

    目录

    马尔可夫链的基本原理

    马氏链严格数学定义

    马氏链模型说明

    转移概率矩阵

    转移概率矩阵性质

    气象案例的马尔可夫链表示

    k步转移概率矩阵

    气象案例的k步转移矩阵

    状态转移概率

    实例:求销售状态的转移概率矩阵

     Matlab程序

    正则链

    吸收链

    马氏链的基本方程

    带利润的马氏链

    应用题型一:市场占有率预测

    问题分析

    模型的建立

    模型构建

    模型求解

    MATLAB程序

    应用题型二:期望利润预测

    模型构建

    模型求解

    钢琴销售的存贮策略

    背景与问题

    分析与假设

    模型建立

    模型求解

    敏感性分析

    Matlab程序 


    马尔可夫链的基本原理

    马氏链严格数学定义

    要描述某种特定时期的随机现象如某种药品在未来某时期的销售情况,比如说第n季度是畅销还是滞销,用一个随机变量Xn便可以了,但要描述未来所有时期的情况,则需要一系列的随机变量X1,X2,…,Xn,….称{ Xt,t∈T T是参数集}为随机过程,{ Xt }的取值集合称为状态空间。若随机过程{ Xn }的参数为非负整数, Xn 为离散随机变量,且{ Xn }具有无后效性(或称马尔可夫性),则称这一随机过程为马尔可夫链(简称马氏链)。所谓无后效性,直观地说,就是如果把{ Xn }的参数n看作时间的话,那么它在将来取什么值只与它现在的取值有关,而与过去取什么值无关。

    马氏链模型说明

    • 时间、状态均为离散的随机转移过程
    • 系统在每个时期所处的状态是随机的
    • 从一时期到下时期的状态按一定概率转移
    • 下时期状态只取决于本时期状态和转移概率
    • 已知现在,将来与过去无关(无后效性)

    转移概率矩阵

    对具有N个状态的马氏链,描述它的概率性质,最重要的是它在n时刻处于状态i下一时刻转移到状态j的一步转移概率:

    若假定上式与n无关,即 

    则可记为p_{ij}(此时,称过程是平稳的),并记

    称为转移概率矩阵。

    转移概率矩阵性质

    转移概率矩阵具有下述性质:

    气象案例的马尔可夫链表示

    由于第二天天气情况不受今天之前天气情况的影响,即状态0和状态1是相互独立且仅有的状态,所以两个状态的概率和为1。因此,该随机过程具有马尔可夫属性,该过程称为马尔可夫链。

     因此,转移矩阵为:

    k步转移概率矩阵

    如果我们考虑状态多次转移的情况,则有过程在n时刻处于状态in+k时刻转移到状态jk步转移概率:

    同样由平稳性,上式概率与n无关,可写成p_{ij}^{(k)}。记

     称为k步转移概率矩阵.其中具有性质:

     一般地有,若P为一步转移矩阵,则k步转移矩阵

    气象案例的k步转移矩阵

    2步转移矩阵:

    说明: 该2步矩阵说明,如果今天是晴天(0),那么后两天仍为晴天(0)的概率为0.76,为雨天(1)概率是0.24;类似地,如果今天是雨天(1),那么后两天为晴天(0)的概率是0.72,为雨天(1)的概率为0.28。

    同样,3天、4天或5天后的气象状态转移概率可通过计算3步、4步和5步转移矩阵得到:

    状态转移概率

     

     在马尔可夫预测方法中,系统状态的转移概率的估算非常重要.估算的方法通常有两种:一是主观概率法,它是根据人们长期积累的经验以及对预测事件的了解,对事件发生的可能性大小的一种主观估计,这种方法一般是在缺乏历史统计资料或资料不全的情况下使用.二是统计估算法,现通过实例进行介绍。

    实例:求销售状态的转移概率矩阵

    • 记录了某抗病毒药的6年24个季度的销售情况,得到表1.试求其销售状态的转移概率矩阵.

    表1  某抗病毒药24个季度的销售情况

    季度

    销售状态

    季度

    销售状态

    季度

    销售状态

    季度

    销售状态

    1

    1 (畅销)

    7

    1(畅销)

    13

    1(畅销)

    19

    2(滞销)

    2

    1(畅销)

    8

    1(畅销)

    14

    1(畅销)

    20

    1(畅销)

    3

    2(滞销)

    9

    1(畅销)

    15

    2(滞销)

    21

    2(滞销)

    4

    1(畅销)

    10

    2(滞销)

    16

    2(滞销)

    22

    1(畅销)

    5

    2(滞销)

    11

    1(畅销)

    17

    1(畅销)

    23

    1(畅销)

    6

    2(滞销)

    12

    2(滞销)

    18

    1(畅销)

    24

    1(畅销)

    分析表中的数据,其中有15个季度畅销,9个季度滞销,连续出现畅销和由畅销转入滞销以及由滞销转入畅销的次数均为7,连续滞销的次数为2.由此,可得到下面的市场状态转移情况表(表2).

    表2  市场状态转移情况表

    下季度药品所处的市场状态

    1(畅销)

    2(滞销)

    本季度药品所

    1(畅销)

    7

    7

    处的市场状态

    2(滞销)

    7

    2

    现计算转移概率.以频率代替概率,可得连续畅销的概率

    分母中的数为15减1是因为第24季度是畅销,无后续记录,需减1.

    同样得由畅销转入滞销的概率:

    滞销转入畅销的概率:

    连续滞销的概率:

    综上,得销售状态转移概率矩阵为:

    从上面的计算过程知,所求转移概率矩阵P的元素其实可以直接通过表2中的数字计算而得到,即将表中数分别除以该数所在行的数字和便可: 

    由此,推广到一般情况,我们得到估计转移概率的方法:假定系统有m种状态S1,S2,…,Sm,根据系统的状态转移的历史记录,得到表3的统计表格,以表示系统从状态i转移到状态j的转移概率估计值,则由表3的数据计算估计值的公式如下:

    表3  系统状态转移情况表

    系统下步所处状态

    S_{1} 

    S_{2} 

    S_{m} 

    S_{1}

    n_{11}

    n_{12}

    n_{1m}

    S_{2}

    n_{21}

    n_{22}

    n_{2m}

    S_{m}

    n_{m1}

    n_{m2}

    n_{mm}

     Matlab程序

    format rat
    clc
    a=[ 1 1 2 1 2 2 1 1 1 2 1 2,1 1 2 2 1 1 2 1 2 1 1 1];
    for i=1:2
    for j=1:2
    f(i,j)=length(findstr([i j],a));
    end
    end
    f
    ni=(sum(f'))'
    for i=1:2
    p(i,:)=f(i,:)/ni(i);
    end
    p

    正则链

    吸收链

    马氏链的基本方程

    带利润的马氏链

    在马氏链模型中,随着时间的推移,系统的状态可能发生转移,这种转移常常会引起某种经济指标的变化.如抗病毒药的销售状态有畅销和滞销两种,在时间变化过程中,有时呈连续畅销或连续滞销,有时由畅销转为滞销或由滞销转为畅销,每次转移不是盈利就是亏本.假定连续畅销时盈r11元,连续滞销时亏本r22元,由畅销转为滞销盈利r12元,由滞销转为畅销盈利r21元,这种随着系统的状态转移,赋予一定利润的马氏链,称为有利润的马氏链.对于一般的具有转移矩阵

    的马氏链,当系统由i转移到j时,赋予利润rij(ij=1,2,…,N),则称 

    为系统的利润矩阵,rij >0称为盈利,rij <0称为亏本,rij = 0称为不亏不盈.

    随着时间的变化,系统的状态不断地转移,从而可得到一系列利润,由于状态的转移是随机的,因而一系列的利润是随机变量,其概率关系由马氏链的转移概率决定.例如从抗病毒药的销售状态的转移矩阵,得到一步利润随机变量的概率分布分别为:

     

     其中  p11+ p12 = 1 ,p21+ p22 = 1.

    如果药品处于畅销阶段,即销售状态为i =1,我们想知道,经过n个季度以后,期望获得的利润是多少?为此,引入一些计算公式.

    首先,定义为抗病毒药现在处于i(i=1,2),经过k步转移之后的总期望利润,则

    一步转移的期望利润为:

    二步转移的期望利润为: 

     

    其中随机变量(称为二步利润随机变量)的分布为:

     

     例如,若

     

    则抗病毒药销售的一步利润随机变量

     抗病毒药畅销和滞销时的一步转移的期望利润分别为:

     二步利润随机变量为:

    抗病毒药畅销和滞销时的二步转移的期望利润分别为: 

    一般地定义k步转移利润随机变量的分布为: 

     

    则系统处于状态i经过k步转移后所得的期望利润的递推计算式为: 

     

    k=1时,规定边界条件. 

    称一步转移的期望利润为即时的期望利润,并记

    应用题型一:市场占有率预测

    在购买该药的总共1000家对象(购买力相当的医院、药店等)中,买A、B、C三药厂的各有400家、300家、300家,预测A、B、C三个厂家生产的某种抗病毒药在未来的市场占有情况。顾客订货情况如下表5:

    表5  顾客订货情况表

                 下季度订货情况

    合计

    A

    B

    C

    A

    160

    120

    120

    400

    B

    180

    90

    30

    300

    C

    180

    30

    90

    300

    合计

    520

    240

    240

    1000

    问题分析

    目前的市场占有情况为:在购买该药的总共1000家对象(购买力相当的医院、药店等)中,买A、B、C三药厂的各有400家、300家、300家,那么A、B、C三药厂目前的市场占有份额分别为:40%、30%、30%.称(0.4,0.3,0.3)为目前市场的占有分布或称初始分布.

    此外,我们需要查清使用对象的流动情况。流动情况的调查可通过发放信息调查表来了解顾客以往的资料或将来的购买意向,也可从下一时期的订货单得出。由题已知顾客订货情况如下表5

    模型的建立

    模型构建

    假定在未来的时期内,顾客相同间隔时间的流动情况不因时期的不同而发生变化,以1、2、3分别表示顾客买A、B、C三厂家的药这三个状态,以季度为模型的步长(即转移一步所需的时间),那么根据表5,我们可以得模型的转移概率矩阵:

    矩阵中的第一行(0.4,0.3,0.3)表示目前是A厂的顾客下季度有40%仍买A厂的药,转为买B厂和C厂的各有30%.同样,第二行、第三行分别表示目前是B厂和C厂的顾客下季度的流向.

    P我们可以计算任意的k步转移矩阵,如三步转移矩阵:

    从这个矩阵的各行可知三个季度以后各厂家顾客的流动情况.如从第二行(0.504,0.252,0.244)知,B厂的顾客三个季度后有50.4%转向买A厂的药,25.2%仍买B厂的,24.4%转向买C厂的药.

    表示预测对象k季度以后的市场占有率,初始分布则为,市场占有率的预测模型为

     

     已知,由此,我们可预测任意时期A、B、C三厂家的市场占有率.例如,三个季度以后的预测值为:

     大致上,A 厂占有一半的市场,B厂、C厂各占四分之一.

     可推广到N个状态的情形:

     如果我们按公式继续逐步求A、B、C三家的市场占有率,会发现,当k大到一定的程度,S (k) 将不会有多少改变,即有稳定的市场占有率,设其稳定值为,满足

    事实上,如果市场的顾客流动趋向长期稳定下去,则经过一段时期以后的市场占有率将会出现稳定的平衡状态,即顾客的流动,不会影响市场的占有率,而且这种占有率与初始分布无关.如何求出这种稳定的市场占有率呢?

    模型求解

    以A、B、C三家的情况为例,当市场出现平衡状态时,从公式(7)可得方程S = S P,即

     由此得

    经整理,并加上条件,得 

     

    0.4 0.3 0.3,0.6 0.3 0.1,0.6 0.1 0.3

    上方程组是三个变量四个方程的方程组,在前三个方程中只有二个是独立的,任意删去一个,从剩下的三个方程中,可求出唯一解:

     

    这就是A、B、C三家的最终市场占有率.

    一般N个状态的稳定市场占有率(稳态概率)可通过解方程组

     

     求得,而公式的前N个方程中只有N-1个是独立的,可任意删去一个。

    MATLAB程序

    format rat
    p=[0.4 0.3 0.3,0.6 0.3 0.1,0.6 0.1 0.3];
    a=[p'-eye(3);ones(1,3)];
    b=[zeros(3,1);1];
    p_limit=a\b

    应用题型二:期望利润预测

    企业追逐市场占有率的真正目的是使利润增加,因此,竞争各方无论是为了夺回市场份额,还是为了保住或者提高市场份额,在制订对策时都必须对期望利润进行预测.

    预测主要分两步进行:

    • ①市场统计调查.首先调查销路的变化情况,即查清由畅销到滞销或由滞销到畅销,连续畅销或连续滞销的可能性是多少.其次统计出由于销路的变化,获得的利润和亏损情况.
    • ②建立数学模型,列出预测公式进行预测.

    例如,通过市场调查,我们得到如下的销路转移表(表6)和利润变化表(表7).由此,我们来建立数学模型.

    表6  销路转移表

    畅销

    滞销

    1

    2

    1

    畅销

    0.5

    0.5

    2

    滞销

    0.4

    0.6

    销路转移表说明连续畅销的可能性为50%,由畅销转入滞销的可能性也是50%,由滞销到畅销为40%,连续滞销的可能性为60%.利润表说明的是连续畅销获利900万元,由畅销到滞销或由滞销到畅销均获利300万元,连续滞销则亏损700万元.从而得到销售状态的转移矩阵P和利润矩阵R分别为:

    表7  利润变化表(单位:百万元)

    畅销

    滞销

    1

    2

    1

    畅销

    9

    3

    2

    滞销

    3

    -7

    模型构建

     PR便构成一个有利润的马氏链.由前面所述的基本原理及公式(6)得下面的预测公式:

    即时期利润:

    k步以后的期望利润:

    模型求解

    将调查数据代入上公式则可预测各时期的期望利润值.如: 

     由此可知,当本季度处于畅销时,在下一季度可以期望获得利润600万元;当本季度处于滞销时,下一季度将期望亏损300万元.

    同样算得:

     由此可预测本季度处于畅销时,两个季度后可期望获利750万元,三个季度后可期望获利855万元;当本季度处于滞销时,两个季度后将亏损240万元,三个季度后亏损144万元。

    钢琴销售的存贮策略

    背景与问题

    钢琴销售

    • 售量很小
    • 商店的库存量不大以免积压资金
    • 一家商店根据经验估计:平均每周的钢琴需求为1架

    存贮策略

    • 每周末检查库存量
    • 仅当库存量为零时,才订购3架供下周销售
    • 否则,不订购

    问题

    • 估计在这种策略下失去销售机会的可能性有多大,以及每周的平均销售量是多少。

    分析与假设

    需求:顾客的到达相互独立

    • 需求量近似服从泊松分布,其参数由需求均值为每周1架确定→计算不同需求量的概率

    失去销售机会:需求超过库存→动态过程→概率

    存贮策略:周末库存量为零时订购3架, 周初到货;否则,不订购

    • 周末的库存量:0, 1, 2, 3
    • 周初的库存量:1, 2, 3共三种状态

    用马氏链描述每周不同的需求导致周初库存状态的变化

    • 以每周初的库存量作为状态变量
    • 状态转移具有无后效性

    在稳态情况下——时间充分长以后

    • 计算该存贮策略失去销售机会的概率、每周的平均销售量

    模型建立

     

     

    模型求解

    估计在这种策略下失去销售机会的可能性

    • 第n周失去销售机会的概率

    • 从长期看,失去销售机会的可能性大约 10%

     估计这种策略下每周的平均销售量

     第n周平均售量

    从长期看,每周的平均销售量为 0.857(架) 

    敏感性分析

    平均需求:每周1 (架) 附近波动时,结果有多大变化

    D_{n}服从均值为\lambda的柏松分布

    状态转移阵

    Matlab程序 

    第n周(n充分大)失去销售机会的概率:

     

    for i=1:10
       lamda=0.5+0.1*i;
       d(i,1)=poisspdf(0,lamda); d(i,2)=poisspdf(1,lamda); d(i,3)=poisspdf(2,lamda);
       d(i,4)=poisspdf(3,lamda); d(i,5)=1-poisscdf(3,lamda);
       p1=[d(i,1) 0 1-d(i,1);d(i,2) d(i,1) 1-d(i,1)-d(i,2);d(i,3) d(i,2) 1-d(i,2)-d(i,3)]';
       [V,D]=eig(p1);  V1(i,:)=abs(V(:,1)/([1 1 1]*V(:,1)))';
       P(i)=[d(i,3)+d(i,4)+d(i,5),d(i,4)+d(i,5),d(i,5)]*V1(i,:)';
    end
    P
    

    \lambda

    0.8

    0.9

    1.0

    1.1

    1.2

    P

    0.073

    0.089

    0.105

    0.122

    0.139

    当平均需求(\lambda=1.0)增长(或减少)10%时,失去销售机会的概率将增长(或减少)约15%

    存贮策略(周末库存为0则订购3架, 否则不订购)已定,计算两个指标(失去销售的概率和每周平均销售量).

    关键是在无后效性的前提下恰当地定义系统的状态变量(本例是每周初的库存量).

    动态随机存贮策略是马氏链的典型应用.

    展开全文
  • 总的来说,许多机器学习竞赛(包括 Kaggle)中最优秀的解决方案所采用的集成方法都建立在一个这样的假设上:将多个模型组合在一起通常可以产生更强大的模型。 本文介绍了集成学习的各种概念,并给出了一些必要的...

     

    「团结就是力量」。这句老话很好地表达了机器学习领域中强大「集成方法」的基本思想。总的来说,许多机器学习竞赛(包括 Kaggle)中最优秀的解决方案所采用的集成方法都建立在一个这样的假设上:将多个模型组合在一起通常可以产生更强大的模型。

    本文介绍了集成学习的各种概念,并给出了一些必要的关键信息,以便读者能很好地理解和使用相关方法,并且能够在有需要的时候设计出合适的解决方案。

     

    640?wx_fmt=png

     

    本文将讨论一些众所周知的概念,如自助法、自助聚合(bagging)、随机森林、提升法(boosting)、堆叠法(stacking)以及许多其它的基础集成学习模型。

     

    为了使所有这些方法之间的联系尽可能清晰,我们将尝试在一个更广阔和逻辑性更强的框架中呈现它们,希望这样会便于读者理解和记忆。

     

    何为集成方法?

     

    集成学习是一种机器学习范式。在集成学习中,我们会训练多个模型(通常称为「弱学习器」)解决相同的问题,并将它们结合起来以获得更好的结果。最重要的假设是:当弱模型被正确组合时,我们可以得到更精确和/或更鲁棒的模型。

     

    在集成学习理论中,我们将弱学习器(或基础模型)称为「模型」,这些模型可用作设计更复杂模型的构件。在大多数情况下,这些基本模型本身的性能并不是非常好,这要么是因为它们具有较高的偏置(例如,低自由度模型),要么是因为他们的方差太大导致鲁棒性不强(例如,高自由度模型)。

     

    集成方法的思想是通过将这些弱学习器的偏置和/或方差结合起来,从而创建一个「强学习器」(或「集成模型」),从而获得更好的性能。

      

    组合弱学习器

     

    为了建立一个集成学习方法,我们首先要选择待聚合的基础模型。在大多数情况下(包括在众所周知的 bagging 和 boosting 方法中),我们会使用单一的基础学习算法,这样一来我们就有了以不同方式训练的同质弱学习器。

     

    这样得到的集成模型被称为「同质的」。然而,也有一些方法使用不同种类的基础学习算法:将一些异质的弱学习器组合成「异质集成模型」。

     

    很重要的一点是:我们对弱学习器的选择应该和我们聚合这些模型的方式相一致。如果我们选择具有低偏置高方差的基础模型,我们应该使用一种倾向于减小方差的聚合方法;而如果我们选择具有低方差高偏置的基础模型,我们应该使用一种倾向于减小偏置的聚合方法。

     

    这就引出了如何组合这些模型的问题。我们可以用三种主要的旨在组合弱学习器的「元算法」: 

     

    • bagging,该方法通常考虑的是同质弱学习器,相互独立地并行学习这些弱学习器,并按照某种确定性的平均过程将它们组合起来。

    • boosting,该方法通常考虑的也是同质弱学习器。它以一种高度自适应的方法顺序地学习这些弱学习器(每个基础模型都依赖于前面的模型),并按照某种确定性的策略将它们组合起来。

    • stacking,该方法通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。

     

    非常粗略地说,我们可以说 bagging 的重点在于获得一个方差比其组成部分更小的集成模型,而 boosting 和 stacking 则将主要生成偏置比其组成部分更低的强模型(即使方差也可以被减小)。

     

    在接下来的章节中,我们将具体介绍 bagging 和 boosting 方法(它们比 stacking 方法使用更广泛,并且让我们可以讨论一些集成学习的关键概念),然后简要概述 stacking 方法。

     

    640?wx_fmt=png

    我们可以将弱学习器结合起来以得到性能更好的模型。组合基础模型的方法应该与这些模型的类型相适应。

     

    关于 Bagging

     

    在「并行化的方法」中,我们单独拟合不同的学习器,因此可以同时训练它们。最著名的方法是「bagging」(代表「自助聚合」),它的目标是生成比单个模型更鲁棒的集成模型。

     

    自助法

     

    这种统计技术先随机抽取出作为替代的 B 个观测值,然后根据一个规模为 N 的初始数据集生成大小为 B 的样本(称为自助样本)。

      

    640?wx_fmt=png

    自助抽样过程示意图。

     

    在某些假设条件下,这些样本具有非常好的统计特性:在一级近似中,它们可以被视为是直接从真实的底层(并且往往是未知的)数据分布中抽取出来的,并且彼此之间相互独立。因此,它们被认为是真实数据分布的代表性和独立样本(几乎是独立同分布的样本)。

     

    为了使这种近似成立,必须验证两个方面的假设。

     

    首先初始数据集的大小 N 应该足够大,以捕获底层分布的大部分复杂性。这样,从数据集中抽样就是从真实分布中抽样的良好近似(代表性)。

     

    其次,与自助样本的大小 B 相比,数据集的规模 N 应该足够大,这样样本之间就不会有太大的相关性(独立性)。注意,接下来我可能还会提到自助样本的这些特性(代表性和独立性),但读者应该始终牢记:「这只是一种近似」。 

     

    举例而言,自助样本通常用于评估统计估计量的方差或置信区间。根据定义,统计估计量是某些观测值的函数。因此,随机变量的方差是根据这些观测值计算得到的。

     

    为了评估这种估计量的方差,我们需要对从感兴趣分布中抽取出来的几个独立样本进行估计。在大多数情况下,相较于实际可用的数据量来说,考虑真正独立的样本所需要的数据量可能太大了。

     

    然而,我们可以使用自助法生成一些自助样本,它们可被视为「最具代表性」以及「最具独立性」(几乎是独立同分布的样本)的样本。这些自助样本使我们可以通过估计每个样本的值,近似得到估计量的方差。

      

    640?wx_fmt=png

    自助法经常被用于评估某些统计估计量的方差或置信区间。

     

    关于 Boosting

     

    在「顺序化的方法中」,组合起来的不同弱模型之间不再相互独立地拟合。其思想是「迭代地」拟合模型,使模型在给定步骤上的训练依赖于之前的步骤上拟合的模型。「Boosting」是这些方法中最著名的一种,它生成的集成模型通常比组成该模型的弱学习器偏置更小。

        

    提升方法

     

    Boosting 方法和bagging 方法的工作思路是一样的:我们构建一系列模型,将它们聚合起来得到一个性能更好的强学习器。然而,与重点在于减小方差的 bagging 不同,boosting 着眼于以一种适应性很强的方式顺序拟合多个弱学习器:序列中每个模型在拟合的过程中,会更加重视那些序列中之前的模型处理地很糟糕的观测数据。

     

    直观地说,每个模型都把注意力集中在目前最难拟合的观测数据上。这样一来,在这个过程的最后,我们就获得了一个具有较低偏置的强学习器(我们会注意到,boosting 也有减小方差的效果)。和 bagging 一样,Boosting 也可以用于回归和分类问题。

     

    由于其重点在于减小偏置,用于 boosting  的基础模型通常是那些低方差高偏置的模型。例如,如果想要使用树作为基础模型,我们将主要选择只有少许几层的较浅决策树。

     

    而选择低方差高偏置模型作为 boosting 弱学习器的另一个重要原因是:这些模型拟合的计算开销较低(参数化时自由度较低)。

     

    实际上,由于拟合不同模型的计算无法并行处理(与 bagging 不同),顺序地拟合若干复杂模型会导致计算开销变得非常高。

       

    一旦选定了弱学习器,我们仍需要定义它们的拟合方式(在拟合当前模型时,要考虑之前模型的哪些信息?)和聚合方式(如何将当前的模型聚合到之前的模型中?)在接下来的两小节中,我们将讨论这些问题,尤其是介绍两个重要的 boosting 算法:自适应提升(adaboost )和梯度提升(gradient boosting)。

     

    简而言之,这两种元算法在顺序化的过程中创建和聚合弱学习器的方式存在差异。自适应增强算法会更新附加给每个训练数据集中观测数据的权重,而梯度提升算法则会更新这些观测数据的值。这里产生差异的主要原因是:两种算法解决优化问题(寻找最佳模型——弱学习器的加权和)的方式不同。 

     

    640?wx_fmt=png

    Boosting 会迭代地拟合一个弱学习器,将其聚合到集成模型中,并「更新」训练数据集,从而在拟合下一个基础模型时更好地考虑当前集成模型的优缺点。

     

    自适应 boosting

     

    在自适应 boosting(通常被称为「adaboost」)中,我们将集成模型定义为 L 个弱学习器的加权和640?wx_fmt=png,其中 c_l 是系数而 w_l 是弱学习器

      

    寻找这种最佳集成模型是一个「困难的优化问题」。因此,我们并没打算一次性地解决该问题(找到给出最佳整体加法模型的所有系数和弱学习器),而是使用了一种更易于处理的「迭代优化过程」(即使它有可能导致我们得到次优解)。

     

    另外,我们将弱学习器逐个添加到当前的集成模型中,在每次迭代中寻找可能的最佳组合(系数、弱学习器)。换句话说,我们循环地将 s_l 定义如下: 

     

    640?wx_fmt=png

     

    其中,c_l 和 w_l 被挑选出来,使得 s_l 是最适合训练数据的模型,因此这是对 s_(l-1) 的最佳可能改进。我们可以进一步将其表示为:

     

    640?wx_fmt=png

       

    其中,E(.) 是给定模型的拟合误差,e(.,.)是损失/误差函数。因此,我们并没有在求和过程中对所有 L 个模型进行「全局优化」,而是通过「局部」优化来近似最优解并将弱学习器逐个添加到强模型中。

     

    更特别的是,在考虑二分类问题时,我们可以将 adaboost 算法重新写入以下过程:首先,它将更新数据集中观测数据的权重,训练一个新的弱学习器,该学习器重点关注当前集成模型误分类的观测数据。其次,它会根据一个表示该弱模型性能的更新系数,将弱学习器添加到加权和中:弱学习器的性能越好,它对强学习器的贡献就越大。

     

    因此,假设我们面对的是一个二分类问题:数据集中有 N 个观测数据,我们想在给定一组弱模型的情况下使用 adaboost 算法。在算法的起始阶段(序列中的第一个模型),所有的观测数据都拥有相同的权重「1/N」。然后,我们将下面的步骤重复 L 次(作用于序列中的 L 个学习器):

      

    • 用当前观测数据的权重拟合可能的最佳弱模型

    • 计算更新系数的值,更新系数是弱学习器的某种标量化评估指标,它表示相对集成模型来说,该弱学习器的分量如何

    • 通过添加新的弱学习器与其更新系数的乘积来更新强学习器

    • 计算新观测数据的权重,该权重表示我们想在下一轮迭代中关注哪些观测数据(聚和模型预测错误的观测数据的权重增加,而正确预测的观测数据的权重减小)

      

    重复这些步骤,我们顺序地构建出 L 个模型,并将它们聚合成一个简单的线性组合,然后由表示每个学习器性能的系数加权。注意,初始 adaboost 算法有一些变体,比如 LogitBoost(分类)或 L2Boost(回归),它们的差异主要取决于损失函数的选择。

     

    640?wx_fmt=png

    Adaboost 在每次迭代中更新观测数据的权重。正确分类的观测数据的权重相对于错误分类的观测数据的权重有所下降。在最终的集成模型中,性能更好的模型具有更高的权重。

     

    Stacking 概述

     

    Stacking 与 bagging 和 boosting 主要存在两方面的差异。首先,Stacking 通常考虑的是异质弱学习器(不同的学习算法被组合在一起),而bagging 和 boosting 主要考虑的是同质弱学习器。其次,stacking 学习用元模型组合基础模型,而bagging 和 boosting 则根据确定性算法组合弱学习器。   

     

    堆叠法(Stacking)

     

    正如上文已经提到的,stacking 的概念是学习几个不同的弱学习器,并通过训练一个元模型来组合它们,然后基于这些弱模型返回的多个预测结果输出最终的预测结果。

     

    因此,为了构建 stacking 模型,我们需要定义两个东西:想要拟合的 L 个学习器以及组合它们的元模型。

     

    例如,对于分类问题来说,我们可以选择 KNN 分类器、logistic 回归和SVM 作为弱学习器,并决定学习神经网络作为元模型。然后,神经网络将会把三个弱学习器的输出作为输入,并返回基于该输入的最终预测。

     

    所以,假设我们想要拟合由 L 个弱学习器组成的 stacking 集成模型。我们必须遵循以下步骤: 

     

    • 将训练数据分为两组

    • 选择 L 个弱学习器,用它们拟合第一组数据

    • 使 L 个学习器中的每个学习器对第二组数据中的观测数据进行预测

    • 在第二组数据上拟合元模型,使用弱学习器做出的预测作为输入

       

    在前面的步骤中,我们将数据集一分为二,因为对用于训练弱学习器的数据的预测与元模型的训练不相关。因此,将数据集分成两部分的一个明显缺点是,我们只有一半的数据用于训练基础模型,另一半数据用于训练元模型。

     

    为了克服这种限制,我们可以使用某种「k-折交叉训练」方法(类似于 k-折交叉验证中的做法)。这样所有的观测数据都可以用来训练元模型:对于任意的观测数据,弱学习器的预测都是通过在 k-1 折数据(不包含已考虑的观测数据)上训练这些弱学习器的实例来完成的。

     

    换句话说,它会在 k-1 折数据上进行训练,从而对剩下的一折数据进行预测。迭代地重复这个过程,就可以得到对任何一折观测数据的预测结果。这样一来,我们就可以为数据集中的每个观测数据生成相关的预测,然后使用所有这些预测结果训练元模型。

     

    640?wx_fmt=png

    Stacking 方法会训练一个元模型,该模型根据较低层的弱学习器返回的输出结果生成最后的输出。640?wx_fmt=png

     

    原文链接:https://towardsdatascience.com/ensemble-methods-bagging-boosting-and-stacking-c9214a10a205

     

     

    展开全文
  • Matlab代码gca 概要 该MATLAB工具箱包含用于生成随机Kong网络模型的...生成实体此步骤主要输入生成Kong隙空间的区域的大小,物体半径的目标分布以及物体对总所需Kong隙度的贡献(所需Kong隙度的一半通常足够好,这可以
  • CSS盒子模型

    千次阅读 2021-12-22 14:18:16
    CSS盒子模型(Box Model) 概念 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括: 外边距(margin),边框(border),内...
  • 设备模型一(基本概念)

    千次阅读 2017-03-08 10:30:21
    设备驱动模型研究好一阵子了,但是很快就忘了,不得不重新再研究,打算记录下来,设备驱动模型系列打算参考wowo科技系列的文章(http://www.wowotech.net/linux_kenrel/13.html)以及自己的理解讲诉一下,开篇的话引入wowo...
  • 模型量化

    千次阅读 2020-10-10 11:44:54
    模型量化是一种将浮点计算转成低比特定点计算的技术,可以有效的降低模型计算强度、参数大小和内存消耗,但往往带来巨大的精度损失。尤其是在极低比特(<4bit)、二值网络(1bit)、甚至将梯度进行量化时,带来的精度...
  • HTML盒模型

    千次阅读 2022-04-09 20:44:00
    模型 ​ 什么是盒模型:每一个标签都是一个矩形,像一个盒子,所以HTML页面的布局可以理解为多个盒子组合嵌套排序而成。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSHciGHI-...
  • Reactor模型详解

    千次阅读 2020-09-30 10:18:42
    文章目录前言一、经典的同步阻塞模型二、单reactor单线程设计1.代码示例三、单reactor多线程设计四、多reactor多线程设计五、Reactor模型结构图总结 前言 说到NIO、Netty,Reactor模型一定是绕不开的,因为这种模式...
  • LSTM分类模型

    千次阅读 2022-03-14 23:03:59
    LSTM分类模型 本文主要固定一个文本分类的流程。分为三个部分: 数据处理。对分类文本数据集做简单的预处理。 模型数据准备。处理上一步的结果,得到模型的输入样本。 模型搭建和训练流程。 程序架构如下: 主要...
  • 小世界网络模型

    千次阅读 2021-09-12 17:49:38
    一、小世界网络模型 1、WS小世界模型 我们在前面的文章中介绍过,上图(a)所示的完全规则的最近邻耦合网络具有较高的聚类特性,但并不具有较短的平均距离。另一方面,完全随机的ER随机图虽然具有小的平均路径长度...
  • 风控建模一:好坏标签定义

    千次阅读 2020-02-04 18:26:14
    风控模型能够准确判别好坏的基本前提是我们精准定义了好坏样本。 如何定义好坏通常被认为是风控建模中最难的环节。 在风控中,当定义风险模型标签时,我们一般会使用类似3T ever 15(该客户在3期应还之中是否有至少...
  • Java内存模型

    万次阅读 多人点赞 2019-10-04 15:09:15
    Java内存模型(JMM)的介绍 在上一篇文章中总结了线程的状态和基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了。在多线程中稍微不注意就会出现线程安全...
  • 软件能力成熟度模型(CMMI)

    万次阅读 多人点赞 2019-04-30 16:27:39
    转载自:... 本章内容提要CMMI概述CMMI的成熟度等级及其过程域CMMI的应用PSP,TSP与CMMI第一节 CMMI概述CMMI( Capability Maturity Model Integration)即能力成熟度模型集成,由CMM (Ca...
  • 【tensorflow】保存模型、再次加载模型等操作

    万次阅读 多人点赞 2018-01-12 21:04:16
    由于经常要使用tensorflow进行网络训练,但是在用的时候每次都要把模型重新跑一遍,这样就比较麻烦;另外由于某些原因程序意外中断,也会导致训练结果拿不到,而保存中间训练过程的模型可以以便下次训练时继续使用。...
  • C/C++/Java/C#的基础类型模型定义

    千次阅读 2012-11-30 11:02:26
    C/C++仅仅定义基本数据类型的关系(字长:CHAR DATETYPE LP32 ILP32 LP64 ILP64 LLP64 JAVA C# CHAR 8 8 8 8 8 16 16 ...
  • 最近有小伙伴关于咨询模型的一些相关东西,可能没有实践过,认知的过程有些难度? 1、什么是观察点? 2、什么是观察期? 3、什么是表现期,多久合适,怎么定义表现期? 4、模型怎么用,是做什么的,为什么建模? 5、...
  • 分布式系统中的一致性模型

    千次阅读 2022-04-15 09:30:34
    一致性模型本质上是进程与数据存储的约定:如果进程遵循某些规则,那么进程对数据的读写操作都是可预期的。
  • 这两天在学习 pytorch 的加载预训练模型和 fine tune 为了方便以后查看,特写成博客。 1. pytorch 预训练模型以及修改 pytorch中自带几种常用的深度学习网络预训练模型,torchvision.models包中包含alexnet、dense...
  • 模型思维-THE MODEL THINKER

    千次阅读 2022-03-31 11:29:51
    Part1为什么需要模型思维 01做一个多模型思考者 使用模型来思考能够带给你的,远远不仅仅是工作绩效的提高。它还会使你成为一个更优秀的人,让你拥有更强的思考能力。你将更擅长评估层出不穷的经济事件和政治...
  • 联邦学习使多方能够在不交流本地数据的情况下协作训练机器学习模型。 联邦学习的一个关键挑战是处理各方本地数据分布的异质性。 尽管已经提出了许多研究来应对这一挑战,但我们发现它们无法在具有深度学习模型的图像...
  • VAR模型Stata实例操作

    千次阅读 2022-04-20 23:10:13
    3.模型平稳性检验 4.格兰杰因果关系检验 上述检验都通过后再进行以下步骤 5.脉冲响应分析 6.方差分解 二.各步骤的具体解释 1.序列平稳性检验 主要两种方法:单位根检验、看ACF、PACF图的截尾拖尾情况 ACF ...
  • PyTorch生成3D模型

    千次阅读 2022-04-02 10:34:22
    本文将介绍如何利用深度学习技术生成3D模型,使用了PyTorch和PolyGen。 1、概述 有一个新兴的深度学习研究领域专注于将 DL 技术应用于 3D 几何和计算机图形应用程序,这一长期研究的集合证明了这一点。对于希望自己...
  • 闲话模型压缩之量化(Quantization)篇

    万次阅读 多人点赞 2020-06-25 15:21:52
    之前在浅谈端上智能之计算优化中有过一些简单的论述,同时在闲话模型压缩之网络剪枝(Network Pruning)篇中更加具体地整理了些关于网络剪枝(network pruning)的东西,今天就再将目光放到另一类方法上
  • Blinn-Phong反射模型

    千次阅读 2022-02-24 10:15:52
    前言 在这一章中,实现光线与对象表面之间的相互作用。目的是在渲染流水线中增加着色功能,所以这里只讨论最基础的局部光照模型。与全局光照不同,在局部光照...定义一个描述材质和光线之间相互作用的反射模型(phon
  • 用Keras LSTM构建编码器-解码器模型

    千次阅读 2020-11-01 11:22:39
    本文是关于如何使用Python和Keras开发一个编解码器模型的实用教程,更精确地说是一个序列到序列(Seq2Seq)。在上一个教程中,我们开发了一个多对多翻译模型,如下图所示: 这种结构有一个重要的限制,即序列长度。...
  • 技术接受模型(TAM,Technology Acceptance Model)

    万次阅读 多人点赞 2015-11-23 15:32:46
    技术接受模型(Technology Acceptance Model,简称TAM)是由美国学者戴维斯(Fred D. Davis, 1986)根据理性行为理论(Theory of Reasoned Action,简称TRA)在信息系统/计算机技术领域发展而来,用于解释和预测人们...
  • 手把手教你使用YOLOV5训练自己的目标检测模型 大家好,这里是肆十二(dejahu),好几个月没有更新了,这两天看了一下关注量,突然多了1k多个朋友关注,想必都是大作业系列教程来的小伙伴。既然有这么多朋友关注这个...
  • 【深度学习】全面理解VGG16模型

    万次阅读 多人点赞 2019-06-18 22:24:48
    全面理解VGG16模型VGG16的结构层次介绍结构图VGG16模型所需要的内存容量介绍卷积中的基本概念1.从input到conv1:2.从conv1到conv2之间的过渡:3.conv2到conv3:4.进入conv3:5.从conv3到conv4之间的过渡:6.最后到三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,424
精华内容 27,769
关键字:

一半模型的定义