模型迭代的目標是找到一個兼具效能和可解釋性的方案,用於ML Editor的推薦系統。第一版根據啟發式規則,作為探索問題的原型。第二版使用TF-IDF向量化文字並結合手動特徵,但校準度不足。第三版模型則專注於30個手動建立的特徵,例如標點符號計數、詞性標籤計數和情感分析,在犧牲少量精確度的同時,大幅提升了校準度和可解釋性。這使得模型更適合用於生成使用者可理解的編輯建議。在實際應用中,我們發現第三版模型能有效引導使用者改進提問品質,提升問題的清晰度和完整性。

模型比較與推薦方法評估

在開發ML Editor的過程中,我們需要選擇合適的模型來提供高品質的推薦。為了實作這一目標,我們需要評估不同模型的效能和推薦的有用性。本文將比較三個連續的模型迭代,並根據關鍵指標評估其效能。

模型需求

為了提供有效的推薦,模型需要滿足以下需求:

  1. 良好的校準:模型的預測機率應該代表問題品質的有意義的估計。
  2. 高精確度:模型提供的推薦應該是準確的。
  3. 可理解的特徵:模型使用的特徵應該是使用者可以理解的,因為它們將作為推薦的基礎。
  4. 足夠快的速度:模型應該足夠快,以便使用黑箱直譯器提供推薦。

版本1:報告卡

在第三章中,我們構建了第一版編輯器,該編輯器完全根據啟發式規則。這個版本使用了硬編碼的規則來編碼可讀性,並以結構化格式向使用者顯示結果。由於這個初始原型是為了開發對問題的直覺而構建的,因此我們不會將其與其他模型進行比較。

版本2:更強大,但更不清晰

在構建了根據啟發式的版本並探索了Stack Overflow資料集之後,我們確定了一個初始的建模方法。我們訓練的簡單模型使用了透過向量化文字和使用在資料探索期間發現的手動建立的特徵生成的特徵組合。

程式碼範例

from sklearn.feature_extraction.text import TfidfVectorizer

# 使用TF-IDF向量化輸入問題
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(questions)

#### 內容解密:
這段程式碼使用TF-IDF向量化輸入問題將文字資料轉換為數值特徵這種方法允許我們將模型的特徵重要性與個別詞語聯絡起來從而實作根據詞級別的推薦

這個模型顯示出可接受的聚合效能,精確度為0.62。然而,其校準卻有很多不足,如圖7-3所示。

版本3:進一步改進

在檢查了模型的特徵重要性之後,我們意識到唯一具有預測性的手動建立特徵是問題長度。其他生成的特徵沒有預測能力。進一步探索資料集揭示了一些似乎具有預測性的特徵:

  • 適度的標點符號使用似乎是高分的預測指標。
  • 情感強烈的問題似乎獲得較低的分數。
  • 描述性且使用更多形容詞的問題似乎獲得較高的分數。

Plantuml圖表

比較與評估

透過比較不同版本的模型,我們可以評估其效能和推薦的有用性。最終,我們需要選擇最合適的模型來提供高品質的推薦。

比較指標

  • 精確度:模型的精確度應該足夠高,以提供準確的推薦。
  • 校準:模型的校準應該良好,以提供有意義的機率估計。
  • 特徵可理解性:模型使用的特徵應該是使用者可以理解的。

透過評估這些指標,我們可以選擇最合適的模型來實作我們的目標。

生成編輯建議的技術探討

在機器學習(ML)驅動的編輯工具中,生成編輯建議是一個關鍵功能。本篇文章將探討如何利用第三版模型(Model 3)生成編輯建議,並對其背後的技術進行詳細分析。

第三版模型的優勢

第三版模型僅使用手動建立的特徵,如標點符號計數、詞性(POS)標籤計數、問題情感分析和問題長度等,共30個特徵。相較於使用向量化表示的模型(超過7,000個特徵),第三版模型的優勢在於其可解釋性和執行效率。

效能比較

  • 精確率(Precision): 第三版模型的精確率為0.597,略低於前兩版模型。
  • 校準度(Calibration): 第三版模型的校準度顯著優於前兩版模型,能夠更準確地預測問題的品質。

生成編輯建議的函式

本文將介紹get_recommendation_and_prediction_from_text函式,該函式接受一個問題文字,輸出編輯建議和問題品質評分。

def get_recommendation_and_prediction_from_text(input_text, num_feats=10):
    global clf, explainer
    feats = get_features_from_input_text(input_text)
    pos_score = clf.predict_proba([feats])[0][1]
    exp = explainer.explain_instance(
        feats, clf.predict_proba, num_features=num_feats, labels=(1,)
    )
    parsed_exps = parse_explanations(exp.as_list())
    recs = get_recommendation_string_from_parsed_exps(parsed_exps)
    return recs, pos_score

函式解析

  1. 特徵提取: get_features_from_input_text函式從輸入文字中提取特徵。
  2. 預測評分: 使用訓練好的分類別器(clf)預測問題的品質評分。
  3. 解釋例項: 使用LIME直譯器(explainer)對特徵進行解釋,得到特徵重要性。
  4. 解析解釋: parse_explanations函式將LIME輸出的特徵重要性轉換為結構化的字典。
  5. 生成建議: get_recommendation_string_from_parsed_exps函式根據解析後的特徵重要性生成編輯建議。

解析LIME解釋

parse_explanations函式負責將LIME輸出的特徵重要性轉換為可讀的建議。

def parse_explanations(exp_list):
    global FEATURE_DISPLAY_NAMES
    parsed_exps = []
    for feat_bound, impact in exp_list:
        conditions = feat_bound.split(" ")
        if len(conditions) == 3:
            feat_name, order, threshold = conditions
            simple_order = simplify_order_sign(order)
            recommended_mod = get_recommended_modification(simple_order, impact)
            parsed_exps.append(
                {
                    "feature": feat_name,
                    "feature_display_name": FEATURE_DISPLAY_NAMES[feat_name],
                    "order": simple_order,
                    "threshold": threshold,
                    "impact": impact,
                    "recommendation": recommended_mod,
                }
            )
    return parsed_exps

內容解密:

  1. feat_bound.split(" ") 將LIME輸出的特徵條件字串按空格分割成三部分:特徵名稱、比較運算子和閾值。
  2. simplify_order_sign(order) 簡化比較運算子,使其更易讀。
  3. get_recommended_modification(simple_order, impact) 根據簡化後的比較運算子和特徵重要性,生成修改建議。

圖表翻譯:

此過程可用以下Plantuml圖表示:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 模型迭代比較與部署監控

package "模型版本迭代" {
    component [V1: 啟發式規則\n報告卡原型] as v1
    component [V2: TF-IDF + 手動特徵\n精確度 0.62] as v2
    component [V3: 30個可解釋特徵\n高校準度] as v3
}

package "V3 特徵工程" {
    component [標點符號計數] as punct
    component [詞性標籤 POS] as pos
    component [情感分析分數] as sentiment
    component [問題長度] as length
}

package "可解釋性 (LIME)" {
    component [特徵重要性] as importance
    component [編輯建議生成] as suggestion
    component [使用者可理解推薦] as recommend
}

package "部署與監控" {
    component [API 端點部署] as api
    component [效能監控] as perf_mon
    component [模型偏差檢測] as drift
    component [A/B 測試] as ab_test
}

v1 --> v2 : 迭代改進
v2 --> v3 : 提升校準度

punct --> v3 : 特徵輸入
pos --> v3 : 特徵輸入
sentiment --> v3 : 特徵輸入
length --> v3 : 特徵輸入

v3 --> importance : LIME 分析
importance --> suggestion : 生成建議
suggestion --> recommend : 輸出推薦

v3 --> api : 模型部署
api --> perf_mon : 監控效能
perf_mon --> drift : 偵測漂移
api --> ab_test : 版本比較

note right of v3
  V3 優勢:
  - 高校準度
  - 可解釋特徵
  - 適合生成建議
end note
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

圖表翻譯: 此圖展示了從輸入文字到輸出編輯建議和評分的整個流程。首先,從輸入文字中提取特徵;接著,使用訓練好的模型預測問題的品質評分;然後,利用LIME直譯器對特徵進行解釋;隨後,解析LIME解釋以生成結構化的特徵重要性;最後,根據這些重要性生成編輯建議並輸出。

佈署與監控機器學習模型

在完成模型的建立和驗證後,我們需要讓使用者能夠存取模型。有多種方法可以將機器學習模型投入使用。最簡單的方法是建立一個小型API,但為了確保模型能夠為所有使用者提供良好的服務,我們需要做更多的工作。

生產環境中的機器學習流程

生產環境中的機器學習流程需要能夠檢測資料和模型的錯誤,並優雅地處理它們。理想情況下,我們還應該能夠主動預測任何錯誤,並制定佈署更新模型的策略。

生產環境中的挑戰

生產環境中的機器學習流程面臨著許多挑戰,包括:

  • 資料品質問題
  • 模型效能下降
  • 模型佈署和管理

本文的解決方案

在本文的第四部分,我們將介紹如何克服這些挑戰。我們將涵蓋以下主題:

驗證與佈署前的準備

在佈署模型之前,我們需要進行最後一輪驗證。這包括檢查潛在的濫用和負面使用情況,並盡可能預測和建立防範措施。

模型佈署的方法與平台

我們將介紹不同的模型佈署方法和平台,並討論如何選擇合適的方法。

建立健全的生產環境

我們將學習如何建立一個健全的生產環境,以支援模型的佈署和維護。這包括檢測和處理模型錯誤、最佳化模型效能和系統化地重新訓練模型。

監控模型的表現

在最後一章中,我們將討論監控模型的重要性、最佳的監控方法和如何將監控設定與佈署策略結合起來。

利用LIME生成模型推薦

LIME(Local Interpretable Model-agnostic Explanations)是一種用於解釋機器學習模型預測結果的方法。我們可以使用LIME來生成模型的推薦。

LIME的工作原理

LIME透過在區域性近似模型的行為來工作。它生成一個簡單的模型,用於解釋原始模型的預測結果。

將LIME應用於文字分類別

我們可以使用LIME來生成文字分類別模型的推薦。下面是一個例子:

def get_recommended_modification(simple_order, impact):
    bigger_than_threshold = simple_order == ">"
    has_positive_impact = impact > 0
    if bigger_than_threshold and has_positive_impact:
        return "No need to decrease"
    if not bigger_than_threshold and not has_positive_impact:
        return "Increase"
    if bigger_than_threshold and not has_positive_impact:
        return "Decrease"
    if not bigger_than_threshold and has_positive_impact:
        return "No need to increase"

def get_recommendation_string_from_parsed_exps(exp_list):
    recommendations = []
    for feature_exp in exp_list:
        recommendation = "%s %s" % (
            feature_exp["recommendation"],
            feature_exp["feature_display_name"],
        )
        recommendations.append(recommendation)
    return recommendations

程式碼解密:

  1. get_recommended_modification函式根據LIME的輸出結果生成推薦。
  2. get_recommendation_string_from_parsed_exps函式將推薦結果轉換為字串。

利用模型推薦改善文字

我們可以使用模型推薦來改善文字。下面是一個例子:

// First attempt at a question
>> get_recommendation_and_prediction_from_text(
"""
I want to learn how models are made
"""
)
0.39 score
Increase question length
Increase vocabulary diversity
Increase frequency of question marks
No need to increase frequency of periods
No need to decrease frequency of stop words

// Following the first three recommendations
>> get_recommendation_and_prediction_from_text(
"""
I'd like to learn about building machine learning products.
Are there any good product focused resources?
Would you be able to recommend educational books?
"""
)
0.48 score
Increase question length
Increase vocabulary diversity
Increase frequency of adverbs
No need to decrease frequency of question marks
Increase frequency of commas

// Following the recommendations once more
>> get_recommendation_and_prediction_from_text(
"""
I'd like to learn more about ML, specifically how to build ML products.
When I attempt to build such products, I always face the same challenge:
how do you go beyond a model?
What are the best practices to use a model in a concrete application?
Are there any good product focused resources?
Would you be able to recommend educational books?
"""
)
0.53 score

圖表翻譯:

此圖示顯示了利用模型推薦改善文字的過程。每次迭代都根據模型的推薦結果對文字進行修改,從而提高了文字的分數。