
譯者 | 李睿
審校 | 重樓
從推薦系統(tǒng)到欺詐檢測(cè),機(jī)器學(xué)習(xí)如今已經(jīng)成為諸多影響人們工作與生活關(guān)鍵技術(shù)的主要驅(qū)動(dòng)力量。然而,構(gòu)建真正能夠解決實(shí)際問題的機(jī)器學(xué)習(xí)模型,僅依靠提高編程能力是遠(yuǎn)遠(yuǎn)不夠的。
成功的機(jī)器學(xué)習(xí)開發(fā)取決于將技術(shù)實(shí)踐與實(shí)際需求緊密結(jié)合,并確保所提出的解決方案能夠產(chǎn)生可衡量的價(jià)值。本文旨在探討構(gòu)建實(shí)際問題的機(jī)器學(xué)習(xí)模型所需遵循的核心原則,包括設(shè)定明確目標(biāo)、獲取高質(zhì)量數(shù)據(jù)、規(guī)劃部署流程以及維護(hù)模型以實(shí)現(xiàn)持續(xù)影響力等方面。
構(gòu)建實(shí)際應(yīng)用機(jī)器學(xué)習(xí)模型的核心原則
本節(jié)將闡述決定機(jī)器學(xué)習(xí)(ML)模型在實(shí)際應(yīng)用場(chǎng)景中是否表現(xiàn)良好的基本原則。重點(diǎn)涵蓋多個(gè)關(guān)鍵主題,包括關(guān)注數(shù)據(jù)質(zhì)量、選擇合適的算法、有效部署模型、部署后的持續(xù)監(jiān)控、保障模型公平性、促進(jìn)團(tuán)隊(duì)協(xié)作以及持續(xù)改進(jìn)等。遵循這些原則,將有助于開發(fā)出實(shí)用性強(qiáng)、可靠性高且易于維護(hù)的機(jī)器學(xué)習(xí)解決方案。
優(yōu)質(zhì)數(shù)據(jù)勝過復(fù)雜算法
即使采用高度復(fù)雜的算法,也需要高質(zhì)量的數(shù)據(jù)支持。IT行業(yè)有句名言:“垃圾進(jìn),垃圾出。”如果采用混亂或有偏見的數(shù)據(jù)來訓(xùn)練模型,所得結(jié)果必然同樣混亂或存在偏差。正如行業(yè)專家所說:“優(yōu)質(zhì)數(shù)據(jù)總是勝過復(fù)雜的算法。”機(jī)器學(xué)習(xí)的成功始于完善的數(shù)據(jù)策略,因?yàn)槠淠P偷馁|(zhì)量取決于其訓(xùn)練數(shù)據(jù)的質(zhì)量。簡(jiǎn)而言之,采用干凈且標(biāo)注良好的數(shù)據(jù)集構(gòu)建的模型通常比基于有缺陷數(shù)據(jù)構(gòu)建的復(fù)雜模型表現(xiàn)更好。
在實(shí)踐中,這意味著在建模之前清理和驗(yàn)證數(shù)據(jù)。例如,美國(guó)加利福尼亞州住房數(shù)據(jù)集(通過sklearn.dataset.fetch_California_housing獲取)包含20640個(gè)樣本和8個(gè)特征(收入中位數(shù)、房齡等)。將其加載到DataFrame中并添加價(jià)格目標(biāo):
from sklearn.datasets import fetch_california_housing
import pandas as pd
import seaborn as sns
california = fetch_california_housing()
dataset = pd.DataFrame(california.data, columns=california.feature_names)
dataset['price'] = california.target
print(dataset.head())
sns.pairplot(dataset)
圖1 配對(duì)圖
圖1展示了包含所有數(shù)值特征及目標(biāo)價(jià)格的數(shù)據(jù)前幾行。然后檢查并清洗數(shù)據(jù):例如,使用info和describe方法檢查缺失值或異常值:
print(dataset.info())
print(dataset.isnull().sum())
print(dataset.describe())
圖2 數(shù)據(jù)集描述
圖2的統(tǒng)計(jì)摘要確認(rèn)數(shù)據(jù)不存在缺失值,并揭示了各特征的數(shù)值范圍。例如,describe()方法顯示了加利福尼亞州人口和收入等特征的取值范圍。

圖3 描述輸出
sns.regplot(x="AveBedrms",y="price",data=dataset)
plt.xlabel("Avg. no. of Bed rooms")
plt.ylabel("House Price")
plt.show()
圖4 加利福尼亞州的房?jī)r(jià)VS平均臥室數(shù)量
圖4顯示了加利福尼亞州房?jī)r(jià)隨臥室數(shù)量的變化而發(fā)生的變化。
在實(shí)際操作中,這意味著:
- 在建模之前識(shí)別并糾正任何缺失值、異常值和測(cè)量誤差。
- 正確地清理和標(biāo)記數(shù)據(jù),并仔細(xì)檢查所有內(nèi)容,以免出現(xiàn)偏見或噪音。
- 引入其他來源的數(shù)據(jù),或通過合成數(shù)據(jù)的方式覆蓋罕見的情況。
首先關(guān)注問題,而不是模型
機(jī)器學(xué)習(xí)項(xiàng)目中最常見的錯(cuò)誤是,在理解要解決的問題之前專注于特定的技術(shù)。因此,在開始建模之前,必須全面理解業(yè)務(wù)環(huán)境和用戶需求。這需要從項(xiàng)目初期就讓相關(guān)利益相關(guān)者參與進(jìn)來,以促進(jìn)實(shí)現(xiàn)目標(biāo),并確保期望一致。
在實(shí)際操作中,這意味著:
- 確定將為項(xiàng)目提供方向的業(yè)務(wù)決策和結(jié)果,例如:貸款審批、定價(jià)策略。
- 通過可量化的業(yè)務(wù)指標(biāo)而不是技術(shù)指標(biāo)來衡量項(xiàng)目成功。
- 收集領(lǐng)域知識(shí),并相應(yīng)地設(shè)置收入增長(zhǎng)目標(biāo)或容錯(cuò)等關(guān)鍵績(jī)效指標(biāo)(KPI)。
- 繪制工作流程圖,例如,機(jī)器學(xué)習(xí)管道將輸入到一個(gè)由房地產(chǎn)分析師使用的Web應(yīng)用程序中,因此需要確保輸入/輸出模式與該應(yīng)用程序匹配。
在技術(shù)實(shí)現(xiàn)層面,這要求在選擇算法之前先確定特征集和評(píng)估標(biāo)準(zhǔn)。例如,可能會(huì)決定刪除不太重要的特征,或優(yōu)先減少高估誤差。
衡量真正重要的指標(biāo)
模型的成功應(yīng)該根據(jù)其實(shí)際業(yè)務(wù)成果而不是技術(shù)評(píng)分來評(píng)估。如果召回率和精確率或均方根誤差(RMSE)不能轉(zhuǎn)化為收入增長(zhǎng)、效率提升或用戶滿意度改善,便失去了實(shí)際意義。因此,始終根據(jù)利益相關(guān)者重視的關(guān)鍵績(jī)效指標(biāo)(KPI)來評(píng)估模型的成功。
例如,在基于閾值的決策場(chǎng)景中(例如判斷是否購(gòu)房),可通過模擬模型在該決策任務(wù)中的準(zhǔn)確性進(jìn)行評(píng)估。在代碼中,雖然計(jì)算標(biāo)準(zhǔn)回歸指標(biāo),但需要結(jié)合業(yè)務(wù)背景進(jìn)行解讀:
from sklearn.metrics import mean_squared_error, r2_score
pred = model.predict(X_test)
print("Test RMSE:", np.sqrt(mean_squared_error(y_test, pred)))
print("Test R^2:", r2_score(y_test, pred))在實(shí)際操作中,這意味著:
- 根據(jù)實(shí)際業(yè)務(wù)成果(如收入、成本節(jié)約或參與度)定義評(píng)估指標(biāo)。
- 不能僅依賴于精確度或均方根誤差(RMSE)等技術(shù)指標(biāo)。
- 采用利益相關(guān)者能理解的業(yè)務(wù)術(shù)語來闡述結(jié)果。
- 使用投資回報(bào)率(ROI)、轉(zhuǎn)化率或提升曲線等指標(biāo)提供實(shí)際價(jià)值。
從簡(jiǎn)單入手,逐步增加復(fù)雜度
許多機(jī)器學(xué)習(xí)項(xiàng)目的失敗源于過早使用復(fù)雜模型。建立簡(jiǎn)單的基準(zhǔn)模型有助于把握方向、降低過擬合風(fēng)險(xiǎn),并簡(jiǎn)化調(diào)試過程。
因此,應(yīng)從簡(jiǎn)單的基準(zhǔn)模型(如線性回歸)開始建模,僅在復(fù)雜度提升能帶來明顯效果時(shí),再逐步增加模型復(fù)雜度。這種方式可避免過擬合,又能保持開發(fā)的靈活性。在本項(xiàng)目的開發(fā)文檔中,在縮放特征之后,首先擬合一個(gè)普通的線性回歸模型:
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
reg_pred = model.predict(X_test)
print("Linear model R^2:", r2_score(y_test, reg_pred))
# 0.5957702326061665
LinearRegression i ?
LinearRegression()這就建立了一個(gè)性能基準(zhǔn)。如果這個(gè)簡(jiǎn)單模型就能滿足需求,就沒有必要復(fù)雜化。在這個(gè)例子中,將嘗試添加多項(xiàng)式特征,觀察是否能降低誤差:
from sklearn.preprocessing import PolynomialFeatures
train_rmse_errors=[]
test_rmse_errors=[]
train_r2_score=[]
test_r2_score=[]
for d in range(2,3):
polynomial_converter = PolynomialFeatures(degree=d,include_bias=False
poly_features = polynomial_converter.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(poly_features, y,test_size=0.3, random_state=42)
model = LinearRegression(fit_intercept=True)
model.fit(X_train,y_train)
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
train_RMSE = np.sqrt(mean_squared_error(y_train,train_pred))
test_RMSE = np.sqrt(mean_squared_error(y_test,test_pred))
train_r2= r2_score(y_train,train_pred)
test_r2 = r2_score(y_test,test_pred)
train_rmse_errors.append(train_RMSE)
test_rmse_errors.append(test_RMSE)
train_r2_score.append(train_r2)
test_r2_score.append(test_r2)
# highest test r^2 score:
highest_r2_score=max(test_r2_score)
highest_r2_score
# 0.6533650019044048在這個(gè)例子中,多項(xiàng)式回歸的表現(xiàn)優(yōu)于線性回歸模型,因此將使用它進(jìn)行測(cè)試集預(yù)測(cè)。在此之前,需要先保存該模型:
with open('scaling.pkl', 'wb') as f:
pickle.dump(scaler, f)
with open('polynomial_converter.pkl', 'wb') as f:
pickle.dump(polynomial_converter, f)
print("Scaler and polynomial features converter saved successfully!")
# Scaler and polynomial features converter saved successfully!在實(shí)際操作中,這意味著:
- 從基準(zhǔn)模型入手(如線性回歸或基于樹的模型)。
- 基準(zhǔn)模型可為復(fù)雜模型的性能提升提供參考依據(jù)。
- 只有在模型出現(xiàn)可衡量的改進(jìn)時(shí),才增加其復(fù)雜度。
- 以漸進(jìn)式方式設(shè)計(jì)模型,確保調(diào)試過程始終簡(jiǎn)單直接。
從項(xiàng)目初期就規(guī)劃部署方案
成功的機(jī)器學(xué)習(xí)項(xiàng)目不僅在于構(gòu)建模型并保存最佳權(quán)重文件,還在于將其投入生產(chǎn)。因此需要從一開始就考慮重要的限制因素,包括延遲、可擴(kuò)展性和安全性。從項(xiàng)目初期就制定部署策略可以簡(jiǎn)化部署過程,并改進(jìn)集成和測(cè)試的計(jì)劃。
所以在設(shè)計(jì)時(shí)考慮到部署。在這個(gè)項(xiàng)目中,從第一天起就知道這個(gè)模型將為一個(gè)Web應(yīng)用程序(一個(gè)Flask服務(wù))提供支持。因此:
- 確保數(shù)據(jù)預(yù)處理是可序列化的(使用pickle保存了StandardScaler和多項(xiàng)式特征對(duì)象)。
- 選擇與基礎(chǔ)設(shè)施兼容的模型格式(也使用pickle保存了訓(xùn)練好的回歸模型)。
- 考慮延遲問題:使用輕量級(jí)的線性模型而不是中大型集成模型以滿足實(shí)時(shí)需求。
import pickle
from flask import Flask, request, jsonify
app = Flask(__name__)
model = pickle.load(open("poly_regmodel.pkl", "rb"))
scaler = pickle.load(open("scaling.pkl", "rb"))
poly_converter = pickle.load(open("polynomial_converter.pkl", "rb"))
@app.route('/predict_api', methods=['POST'])
def predict_api():
data = request.json['data']
inp = np.array(list(data.values())).reshape(1, -1)
scaled = scaler.transform(inp)
features = poly_converter.transform(scaled)
output = model.predict(features)
return jsonify(output[0])這段代碼展示了可用于生產(chǎn)環(huán)境的預(yù)測(cè)流程。它加載預(yù)處理模塊和模型,接收JSON格式的輸入,并返回價(jià)格預(yù)測(cè)結(jié)果。從一開始就考慮API設(shè)計(jì)、版本控制以及可復(fù)現(xiàn)性,就能避免在最后集成階段遇到各種棘手問題。
在實(shí)際操作中,這意味著:
- 在項(xiàng)目初期就明確識(shí)別部署需求,包括可擴(kuò)展性、延遲和資源限制等方面。
- 在模型開發(fā)工作流程中納入版本控制、自動(dòng)化測(cè)試和容器化技術(shù)。
- 盡可能在項(xiàng)目初期就考慮數(shù)據(jù)的移動(dòng)方式、集成點(diǎn)以及錯(cuò)誤處理機(jī)制。
- 從項(xiàng)目一開始就與工程或DevOps團(tuán)隊(duì)緊密合作。
模型上線之后仍需持續(xù)關(guān)注
部署并非終點(diǎn);隨著數(shù)據(jù)和環(huán)境的變化,模型可能會(huì)出現(xiàn)漂移或性能下降的情況。因此,持續(xù)監(jiān)控是確保模型可靠性和影響力的關(guān)鍵環(huán)節(jié)。應(yīng)該密切關(guān)注模型漂移、異常情況或準(zhǔn)確率下降等問題,并盡量將模型性能與業(yè)務(wù)成果相關(guān)聯(lián)。確保定期重新訓(xùn)練模型并妥善記錄日志,這對(duì)于保證模型長(zhǎng)期保持準(zhǔn)確、合規(guī)且與現(xiàn)實(shí)世界緊密相關(guān)至關(guān)重要。
此外,還計(jì)劃設(shè)置自動(dòng)重新訓(xùn)練的觸發(fā)機(jī)制:例如,如果輸入的分布或模型誤差發(fā)生重大變化,系統(tǒng)將標(biāo)記為重新訓(xùn)練。雖然沒有在這里實(shí)現(xiàn)完整的監(jiān)控堆棧,但注意到這一原則意味著建立持續(xù)的評(píng)估。示例如下:
# (Pseudo-code for monitoring loop)
new_data = load_recent_data()
preds = model.predict(poly_converter.transform(scaler.transform(new_data[features])))
error = np.sqrt(mean_squared_error(new_data['price'], preds))
if error > threshold:
alert_team()在實(shí)際操作中,這意味著:
- 使用儀表板監(jiān)控輸入數(shù)據(jù)分布和輸出指標(biāo)。
- 在關(guān)注技術(shù)準(zhǔn)確性指標(biāo)的同時(shí),要考慮監(jiān)測(cè)與業(yè)務(wù)關(guān)鍵績(jī)效指標(biāo)(KPI)的關(guān)聯(lián)情況。
- 配置警報(bào)以進(jìn)行初步監(jiān)控,及時(shí)檢測(cè)異常或數(shù)據(jù)漂移。
- 定期重新訓(xùn)練和更新模型,以確保保持性能持續(xù)穩(wěn)定。
持續(xù)改進(jìn)和更新
機(jī)器學(xué)習(xí)的改進(jìn)是一個(gè)永無止境的過程,也就是說,數(shù)據(jù)、工具和業(yè)務(wù)需求都在不斷變化。因此,持續(xù)的學(xué)習(xí)和迭代是使模型保持準(zhǔn)確性和相關(guān)性的根本途徑。通過迭代更新、錯(cuò)誤分析、探索新算法以及拓展技能組合,使組織的團(tuán)隊(duì)能夠更好地維持模型的卓越性能。
在實(shí)際操作中,這意味著:
- 安排定期使用增量數(shù)據(jù)進(jìn)行重新訓(xùn)練。
- 收集反饋和錯(cuò)誤分析以改進(jìn)模型。
- 嘗試采用能增加價(jià)值的新算法、工具或特征。
- 投資于漸進(jìn)式培訓(xùn),以增強(qiáng)團(tuán)隊(duì)在機(jī)器學(xué)習(xí)方面的知識(shí)儲(chǔ)備。
構(gòu)建公平且可解釋的模型
當(dāng)模型能夠影響人們的日常生活或工作時(shí),公平性和透明度至關(guān)重要。數(shù)據(jù)和算法中的偏見可能導(dǎo)致有害后果,而無法提供解釋的“黑盒”模型則會(huì)失去用戶的信任。通過努力確保模型的公平性并提供可解釋性,組織能夠建立信任、履行道德責(zé)任,并為模型預(yù)測(cè)提供透明合理的依據(jù)。這一原則在醫(yī)療健康、就業(yè)和金融等敏感領(lǐng)域尤為重要。
在實(shí)際操作中,這意味著:
- 對(duì)不同群體(如按性別、種族等劃分)的模型表現(xiàn)展開調(diào)查,以識(shí)別是否存在任何差異。
- 有意識(shí)地采用公平性技術(shù),例如重新加權(quán)或?qū)剐匀テ确椒ā?/span>
- 使用可解釋性工具(例如SHA、LIME等),并向受眾公開模型的運(yùn)作機(jī)制,保持模型透明度。
- 建立多元化的團(tuán)隊(duì),并向受眾公開模型的運(yùn)作機(jī)制,保持模型透明度。
注意:如需查看完整版代碼,可以訪問GitHub存儲(chǔ)庫。
結(jié)論
有效的機(jī)器學(xué)習(xí)系統(tǒng)需要具備清晰性、簡(jiǎn)潔性、協(xié)作性和持續(xù)的靈活性。應(yīng)當(dāng)從明確的目標(biāo)出發(fā),使用高質(zhì)量的數(shù)據(jù),并盡早考慮部署問題。持續(xù)的重新訓(xùn)練以及吸納不同利益相關(guān)者的觀點(diǎn)和見解,將有助于提升項(xiàng)目成果。通過建立明確的問責(zé)機(jī)制和流程,組織能夠?qū)嵤┏龀浞帧⒖煽俊⑼该髑夷茈S時(shí)間靈活調(diào)整的機(jī)器學(xué)習(xí)解決方案。
常見問題解答
Q1:為什么數(shù)據(jù)質(zhì)量比使用高級(jí)算法更重要?
A:因?yàn)榱淤|(zhì)的數(shù)據(jù)導(dǎo)致糟糕的結(jié)果。干凈、無偏見且標(biāo)記良好的數(shù)據(jù)集始終優(yōu)于基于有缺陷數(shù)據(jù)訓(xùn)練的復(fù)雜模型。
Q2:如何衡量機(jī)器學(xué)習(xí)項(xiàng)目的成功?
A:應(yīng)以業(yè)務(wù)成果(如收入、成本節(jié)約或用戶滿意度)為衡量標(biāo)準(zhǔn),而非僅關(guān)注均方根誤差(RMSE)或精確率等技術(shù)指標(biāo)。
Q3:為什么要先從簡(jiǎn)單模型開始?
A:簡(jiǎn)單模型提供了基準(zhǔn),更易于調(diào)試,并且通常無需采用復(fù)雜化解決方案就能滿足要求。
Q4:在模型部署前應(yīng)該規(guī)劃什么?
A:從一開始就考慮可擴(kuò)展性、延遲、安全性、版本控制和集成,以避免在最后一刻出現(xiàn)問題。
Q5:為什么需要在部署后進(jìn)行監(jiān)測(cè)?
A:因?yàn)閿?shù)據(jù)會(huì)隨著時(shí)間而變化。監(jiān)測(cè)有助于檢測(cè)漂移,保持準(zhǔn)確性,并確保模型保持相關(guān)性和可靠性。
原文標(biāo)題:Tips for Building ML Models that Solve Real Problems,作者:Vipin Vashisth
























