網(wǎng)站開發(fā)湛江西安搜索引擎優(yōu)化
文章目錄
- 介紹機器學習的實戰(zhàn)框架
- 1.定義問題
- 2.收集數(shù)據(jù)和預(yù)處理
- (1).收集數(shù)據(jù)
- (2).數(shù)據(jù)可視化
- (3).數(shù)據(jù)清洗
- (4).特征工程
- (5).構(gòu)建特征集和標簽集
- (6).拆分訓練集、驗證集和測試集。
- 3.選擇算法并建立模型
- 4.訓練模型
- 5.模型的評估和優(yōu)化
介紹機器學習的實戰(zhàn)框架
一個機器學習項目從開始到結(jié)束大致分為 5 步,分別是定義問題、收集數(shù)據(jù)和預(yù)處理、選擇算法和確定模型、訓練擬合模型、評估并優(yōu)化模型性能。這 5 步是一個循環(huán)迭代的過程,你可以參考下面的圖片:
1.定義問題
我們項目的目標就是,建立一個機器學習模型,根據(jù)點贊數(shù)和轉(zhuǎn)發(fā)數(shù)等指標,估計一篇文章能實現(xiàn)多大的瀏覽量。
因為要估計瀏覽量,所以在這個數(shù)據(jù)集中:點贊數(shù)、轉(zhuǎn)發(fā)數(shù)、熱度指數(shù)、文章評級,這 4 個字段都是特征,瀏覽量就是標簽。這里我們已經(jīng)有要估計的標簽了,所以這是一個監(jiān)督學習問題。再加上我們的標簽是連續(xù)性的數(shù)值,因此它是一個回歸問題。
2.收集數(shù)據(jù)和預(yù)處理
(1).收集數(shù)據(jù)
首先是收集數(shù)據(jù),這一步又叫采集數(shù)據(jù)。
在現(xiàn)實中,收集數(shù)據(jù)通常很辛苦,要在運營環(huán)節(jié)做很多數(shù)據(jù)埋點、獲取用戶消費等行為信息和興趣偏好信息,有時候還需要上網(wǎng)爬取數(shù)據(jù)。
收集數(shù)據(jù)的方法有很多,這里推薦之前寫過的相關(guān)文章:
數(shù)據(jù)爬蟲(JSON格式)&數(shù)據(jù)地圖可視化(pyecharts)【步驟清晰,一看就懂】:https://blog.csdn.net/weixin_42504788/article/details/134588642
數(shù)據(jù)爬取+數(shù)據(jù)可視化實戰(zhàn)_哪里只得我共你(Dear Jane)_詞云展示----網(wǎng)易云:https://blog.csdn.net/weixin_42504788/article/details/134622850
數(shù)據(jù)爬取+可視化實戰(zhàn)_告白氣球_詞云展示----酷狗音樂:https://blog.csdn.net/weixin_42504788/article/details/134622575
處理Json格式的數(shù)據(jù),如何用Python將數(shù)據(jù)存放入Excel中(步驟清晰,一看就懂):https://blog.csdn.net/weixin_42504788/article/details/134543733
(2).數(shù)據(jù)可視化
數(shù)據(jù)可視化是個萬金油技能,能做的事非常多。比如說,可以看一看特征和標簽之間可能存在的關(guān)系,也可以看看數(shù)據(jù)里有沒有“臟數(shù)據(jù)”和“離群點”等。
常用的工具包有:
import matplotlib.pyplot as plt # Matplotlib – Python畫圖工具庫
import seaborn as sns # Seaborn – 統(tǒng)計學數(shù)據(jù)可視化工具庫
(3).數(shù)據(jù)清洗
處理缺失的數(shù)據(jù):用均值填充、眾數(shù)填充或0。如果建模用樹模型,也可以不填充,樹模型算法自身可以處理缺失值。
處理重復(fù)的數(shù)據(jù):完全相同,刪去即可。
處理錯誤的數(shù)據(jù):部門人數(shù)、銷量、銷售金額小于0,遇到這類情況刪去即可。
處理不可用的數(shù)據(jù):建模的時候,數(shù)據(jù)必須是數(shù)字,不能是中英文等情況。比如性別出現(xiàn)男女字樣,需要轉(zhuǎn)化后再進行建模
查看空缺值NaN出現(xiàn)的次數(shù):df.isna().sum()
把出現(xiàn)了NaN的數(shù)據(jù)行刪掉:df = df.dropna()
(4).特征工程
特征貼合業(yè)務(wù)實際,特征越豐富,模型效果會更好
(5).構(gòu)建特征集和標簽集
特征是輸入機器學習模型的變量。
X = df.drop(['瀏覽量'],axis=1)
X.head()
標簽是結(jié)果或目標。
y = df.瀏覽量
y.head()
(6).拆分訓練集、驗證集和測試集。
一般為了簡化,驗證集會省略,這里展示如何從數(shù)據(jù)中切分出訓練集跟測試集
#將數(shù)據(jù)集進行80%(訓練集)和20%(驗證集)的分割
from sklearn.model_selection import train_test_split #導(dǎo)入train_test_split工具
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
random_state設(shè)置一個值,保證每次切分的數(shù)據(jù)都一致,再次運行建模的效果也出現(xiàn)一致性。
X_train:訓練集的特征
X_test:測試集的特征
y_train:訓練集的標簽
y_test:測試集的標簽
3.選擇算法并建立模型
進行多個機器學習算法進行比較,將最優(yōu)的算法作為baseline
這里舉個經(jīng)典的邏輯回歸例子,
from sklearn.linear_model import LinearRegression # 導(dǎo)入線性回歸算法模型
linereg_model = LinearRegression() # 使用線性回歸算法創(chuàng)建模型
對于 LinearRegression 模型來講,它的外部參數(shù)主要包括兩個布爾值:
- fit_intercept ,默認值為 True,代表是否計算模型的截距。
- normalize,默認值為 False,代表是否對特征 X 在回歸之前做規(guī)范化。
4.訓練模型
訓練模型就是用訓練集中的特征變量和已知標簽,根據(jù)當前樣本的損失大小來逐漸擬合函數(shù),確定最優(yōu)的內(nèi)部參數(shù),最后完成模型
fit 方法是機器學習的核心環(huán)節(jié),里面封裝了很多具體的機器學習核心算法,我們只需要把特征訓練數(shù)據(jù)集和標簽訓練數(shù)據(jù)集,同時作為參數(shù)傳進 fit 方法就行了。
linereg_model.fit(X_train, y_train) # 用訓練集數(shù)據(jù),訓練機器,擬合函數(shù),確定內(nèi)部參數(shù)
不要小看上面那個簡單的 fit 語句,這是模型進行自我學習的關(guān)鍵過程。
fit 的核心就是減少損失,使函數(shù)對特征到標簽的模擬越來越貼切。
這個擬合的過程,同時也是機器學習算法優(yōu)化其內(nèi)部參數(shù)的過程。而優(yōu)化參數(shù)的關(guān)鍵就是減小損失。
那什么是損失呢?它其實是對糟糕預(yù)測的懲罰,同時也是對模型好壞的度量。如果模型的預(yù)測完全準確,則損失為 0;如果不準確,就有損失。
在機器學習中,我們追求的當然是比較小的損失。不過,模型好不好,還不能僅看單個樣本,還要針對所有數(shù)據(jù)樣本,找到一組平均損失“較小”的函數(shù)模型。樣本的損失大小,從幾何意義上基本可以理解為預(yù)測值和真值之間的幾何距離。平均距離越大,說明誤差越大,模型越離譜。在下面這個圖中,左邊是平均損失較大的模型,右邊是平均損失較小的模型,模型所有數(shù)據(jù)點的平均損失很明顯大過右邊模型。
回歸模型的擬合,它的關(guān)鍵環(huán)節(jié)就是通過梯度下降,逐步優(yōu)化模型的參數(shù),使訓練集誤差值達到最小。這也就是我們剛才講的那個 fit 語句所要實現(xiàn)的最優(yōu)化過程。
就像圖里這樣,梯度下降其實就和下山一樣。你可以想象一下,當你站在高處,你的目標就是找到一系列的參數(shù),讓訓練數(shù)據(jù)集上的損失值最小。那么你該往哪走才能保證損失值最小呢?關(guān)鍵就是通過求導(dǎo)的方法,找到每一步的方向,確??偸峭〉膿p失方向前進。
5.模型的評估和優(yōu)化
梯度下降是在用訓練集擬合模型時最小化誤差,這時候算法調(diào)整的是模型的內(nèi)部參數(shù)。而在驗證集或者測試集進行模型效果評估的過程中,我們則是通過最小化誤差來實現(xiàn)超參數(shù)(模型外部參數(shù))的優(yōu)化。
機器學習工具包(如 scikit-learn)中都會提供常用的工具和指標,對驗證集和測試集進行評估,進而計算當前的誤差。比如 R2 或者 MSE 均方誤差指標,就可以用于評估回歸分析模型的優(yōu)劣。
當我們預(yù)測完測試集的瀏覽量后,我們要再拿這個預(yù)測結(jié)果去和測試集已有的真值去比較,這樣才能夠求出模型的性能。而這整個過程也同樣是一個循環(huán)迭代的過程
預(yù)測測試集的瀏覽量,只需要用訓練好的模型 linereg_model 中的 predict 方法,在 X_test(特征測試集)上進行預(yù)測,這個方法就會返回對測試集的預(yù)測結(jié)果。
y_pred = linereg_model.predict(X_test) #預(yù)測測試集的Y值
拿到預(yù)測結(jié)果后,我們再通過下面的代碼,把測試數(shù)據(jù)集的原始特征數(shù)據(jù)、原始標簽真值,以及模型對標簽的預(yù)測值組合在一起進行顯示、比較。
df_ads_pred = X_test.copy() # 測試集特征數(shù)據(jù)
df_ads_pred['瀏覽量真值'] = y_test # 測試集標簽真值
df_ads_pred['瀏覽量預(yù)測值'] = y_pred # 測試集標簽預(yù)測值
df_ads_pred #顯示數(shù)據(jù)
如果你想看看現(xiàn)在的模型長得什么樣?你可以通過 LinearRegression 的 coef_ 和 intercept_ 屬性打印出各個特征的權(quán)重和模型的偏置來。它們也就是模型的內(nèi)部參數(shù)。
print('當前模型的4個特征的權(quán)重分別是: ', linereg_model.coef_)
print('當前模型的截距(偏置)是: ', linereg_model.intercept_)# 輸出結(jié)果:
# 當前模型的4個特征的權(quán)重分別是: [ 48.08395224 34.73062229 29730.13312489 2949.62196343]
# 當前模型的截距(偏置)是: -127493.90606857178
這也就是說,我們現(xiàn)在的模型的線性回歸公式是:
yy=48.08x1?(點贊)+34.73x2?(轉(zhuǎn)發(fā))+29730.13x3?(熱度)+2949.62x4?(評級)?127493.91
對當前這個模型,給出評估分數(shù):
print("線性回歸預(yù)測評分:", linereg_model.score(X_test, y_test)) # 評估模型# 輸出結(jié)果:
# 線性回歸預(yù)測評分: 0.7085754407718876
一般來說,R2 的取值在 0 到 1 之間,R2 越大,說明所擬合的回歸模型越優(yōu)。現(xiàn)在我們得到的 R2 值約為 0.708,在沒有與其它模型進行比較之前,我們實際上也沒法確定它是否能令人滿意。
如果模型的評估分數(shù)不理想,我們就需要回到第 3 步,調(diào)整模型的外部參數(shù),重新訓練模型。要是得到的結(jié)果依舊不理想,那我們就要考慮選擇其他算法,創(chuàng)建全新的模型了。如果很不幸,新模型的效果還是不好的話,我們就得回到第 2 步,看看是不是數(shù)據(jù)出了問題。
當模型通過了評估,就可以去解決實際問題了,機器學習項目也算是基本結(jié)束。
學習機器學習的參考資料:
(1)書籍
利用Python進行數(shù)據(jù)分析
西瓜書
百面機器學習
機器學習實戰(zhàn)
阿里云天池大賽賽題解析(機器學習篇)
白話機器學習中的數(shù)學
零基礎(chǔ)學機器學習
圖解機器學習算法
…
(2)機構(gòu)
光環(huán)大數(shù)據(jù)
開課吧
極客時間
七月在線
深度之眼
貪心學院
拉勾教育
博學谷
…