欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:人工智能 機器學(xué)習(xí)實戰(zhàn)練手項目

柚子快報激活碼778899分享:人工智能 機器學(xué)習(xí)實戰(zhàn)練手項目

http://yzkb.51969.com/

前導(dǎo)

更多文章代碼詳情可查看博主個人網(wǎng)站:https://www.iwtmbtly.com/

下文用到的數(shù)據(jù)集和代碼可以從這里下載《數(shù)據(jù)集》

機器學(xué)習(xí)是一種從數(shù)據(jù)生成規(guī)則、發(fā)現(xiàn)模型,來幫助我們預(yù)測、判斷、分析和解決問題的技術(shù)。

一個機器學(xué)習(xí)項目從開始到結(jié)束大致分為5步,分別是定義問題、收集數(shù)據(jù)和預(yù)處理、選擇算法和確定模型、訓(xùn)練擬合模型、評估并優(yōu)化模型性能。這5步是一個循環(huán)迭代的過程,可以參考下面的圖片:

所有的項目都會按照這5步來做,我把它簡稱為實戰(zhàn)5步。為了讓你更深地理解這5步,在后面能更快地上手,我會帶你做一個項目,我會給你清楚解釋每一個步驟的目的和背后的原理。首先我們先來一起搞定前兩步,也就是定義問題和數(shù)據(jù)的預(yù)處理。

第一步:定義問題

我們先來看第一步,定義問題。在定義問題這個環(huán)節(jié)中,我們要剖析業(yè)務(wù)場景,設(shè)定清晰的目標(biāo),同時還要明確當(dāng)前問題屬于哪一種機器學(xué)習(xí)類型。如果不搞清楚這些,我們后面就無法選擇模型了。

所以首先,我們先得來了解一下我們這個項目的業(yè)務(wù)場景。假設(shè)你已經(jīng)入職了“易速鮮花”的運營部,正在對微信公眾號推廣文案的運營效率進行分析。你收集了大量的軟文數(shù)據(jù),包括點贊數(shù)、轉(zhuǎn)發(fā)數(shù)和瀏覽量等等,就像下面這樣:

因為微信公眾號閱讀量超過10萬之后,就不能顯示它的具體閱讀量了。所以針對這個問題,我們項目的目標(biāo)就是,建立一個機器學(xué)習(xí)模型,根據(jù)點贊數(shù)和轉(zhuǎn)發(fā)數(shù)等指標(biāo),估計一篇文章能實現(xiàn)多大的瀏覽量。

因為要估計瀏覽量,所以在這個數(shù)據(jù)集中:點贊數(shù)、轉(zhuǎn)發(fā)數(shù)、熱度指數(shù)、文章評級,這4個字段都是特征,瀏覽量就是標(biāo)簽。這里我們已經(jīng)有要估計的標(biāo)簽了,所以這是一個監(jiān)督學(xué)習(xí)問題。再加上我們的標(biāo)簽是連續(xù)性的數(shù)值,因此它是一個回歸問題。

不難看出,在這個數(shù)據(jù)集中,特征和標(biāo)簽之間明顯呈現(xiàn)出一種相關(guān)性:點贊數(shù)、轉(zhuǎn)發(fā)數(shù)多的時候,往往瀏覽量也多。但是,這種相關(guān)性可以通過哪個具體的函數(shù)來描繪呢?目前我們還不知道,所以我們在這個項目中的任務(wù)就是找到這個函數(shù)。

第二步:收集數(shù)據(jù)和預(yù)處理

“數(shù)據(jù)的收集和預(yù)處理”在所有機器學(xué)習(xí)項目中都會出現(xiàn),它的作用是為機器學(xué)習(xí)模型提供好的燃料。數(shù)據(jù)好,模型才跑得更帶勁。這步驟看似只有一句話,其實里面包含了好幾個小步驟,完整來講有6步:

收集數(shù)據(jù);數(shù)據(jù)可視化;數(shù)據(jù)清洗;特征工程;構(gòu)建特征集和標(biāo)簽集;拆分訓(xùn)練集、驗證集和測試集。

你可能一眼看上去不太明白這6個步驟的意思。不要著急,接下來我會繼續(xù)結(jié)合“易速鮮花”這個項目挨個解釋的。

(一)收集數(shù)據(jù)

首先是收集數(shù)據(jù),這一步又叫采集數(shù)據(jù)。在我們的項目中,我已經(jīng)把它做好了,你可以在這里下載現(xiàn)成的數(shù)據(jù)集。

不過,在現(xiàn)實中,收集數(shù)據(jù)通常很辛苦,要在運營環(huán)節(jié)做很多數(shù)據(jù)埋點、獲取用戶消費等行為信息和興趣偏好信息,有時候還需要上網(wǎng)爬取數(shù)據(jù)。

有了數(shù)據(jù)集,接下來我們要做的是數(shù)據(jù)可視化的工作,也就是通過可視化去觀察一下數(shù)據(jù),為選擇具體的機器學(xué)習(xí)模型找找感覺。

(二)數(shù)據(jù)可視化

數(shù)據(jù)可視化是個萬金油技能,能做的事非常多。比如說,可以看一看特征和標(biāo)簽之間可能存在的關(guān)系,也可以看看數(shù)據(jù)里有沒有“臟數(shù)據(jù)”和“離群點”等。如果想要深入學(xué)習(xí)數(shù)據(jù)可視化,推薦可以看這篇文章《一次學(xué)會Python數(shù)據(jù)可視化》。

不過在正式可視化之前,我們需要把收集到的數(shù)據(jù)導(dǎo)入運行環(huán)境。數(shù)據(jù)導(dǎo)入我們需要用到Pandas數(shù)據(jù)處理工具包。這個包可是操作數(shù)據(jù)的利器,我們未來每個項目中都會用到。現(xiàn)在我們用import語句導(dǎo)入它,然后,我們通過下面的代碼把這個項目的數(shù)據(jù)集讀入到Python運行環(huán)境,用DataFrame的形式呈現(xiàn)出來::

importpandasaspd # 導(dǎo)入Pandas數(shù)據(jù)處理工具包

df_ads=pd.read_csv('.\data\易速鮮花微信軟文.csv') # 讀入數(shù)據(jù)

df_ads.head() # 顯示前幾行數(shù)據(jù)

DataFrame是機器學(xué)習(xí)中常見的二維表格類型數(shù)據(jù)結(jié)構(gòu)。在上面的代碼中,我用read_csv()API把CSV格式的數(shù)據(jù)文件,讀入到Pandas的DataFrame中,把它命名為了df_ads。這段代碼輸出如下:

這樣就完成了數(shù)據(jù)的導(dǎo)入了,接著我們就可以正式進入“可視化”了。根據(jù)經(jīng)驗,我們猜測“點贊數(shù)”最有可能和“瀏覽量”之間存在線性關(guān)系。那是不是真的這樣呢?我們可以畫出圖來驗證一下。

在這個“驗證”環(huán)節(jié)中,我們需要用到兩個包:一個是Python畫圖工具庫“Matplotlib”,另一個是統(tǒng)計學(xué)數(shù)據(jù)可視化工具庫“Seaborn”。這兩個包都是Python數(shù)據(jù)可視化的必備工具包,它們是Anaconda默認(rèn)安裝包的一部分,不需要pip install語句重復(fù)安裝。

在導(dǎo)入這兩個包時,我們依舊用import語句。請你注意,為了節(jié)省代碼量,也是為了加快運行速度,我并沒有導(dǎo)入完整的matplotlib包,而是只導(dǎo)入了matplotlib包中的繪圖模塊pyplot,因為線性關(guān)系可以簡單地用散點圖來驗證一下。所以下面我們用matplotlib包中的plot()API,繪制出“點贊數(shù)”和“瀏覽量”之間的散點圖,看看它們的分布狀態(tài):

# 導(dǎo)入數(shù)據(jù)可視化所需要的庫

importmatplotlib.pyplotasplt # Matplotlib–Python畫圖工具庫

importseabornassns # Seaborn–統(tǒng)計學(xué)數(shù)據(jù)可視化工具庫

# 方法一

plt.figure(dpi=500) # 設(shè)置圖形的清晰度

plt.plot(df_ads['點贊數(shù)'],df_ads['瀏覽量'],'r.',label='Trainingdata') # 用matplotlib畫圖

plt.xlabel('點贊數(shù)') # x軸Label

plt.ylabel('瀏覽量') # y軸Label

plt.legend() # 顯示圖例

plt.show() # 顯示繪圖結(jié)果

# 方法二

plt.figure(dpi=500) # 設(shè)置圖形的清晰度

plt.scatter(df_ads['點贊數(shù)'],df_ads['瀏覽量'],marker='o')

plt.xlabel('點贊數(shù)') # x軸Label

plt.ylabel('瀏覽量') # y軸Label

plt.show()

輸出的結(jié)果如下圖所示:

從這張圖中我們可以看出來,這些數(shù)據(jù)基本上集中在一條線附近,所以它的標(biāo)簽和特征之間,好像真的存在著線性的關(guān)系,這可以為我們將來選模型提供參考信息。

接下來,我要用Seaborn的boxplot工具畫個箱線圖。來看看這個數(shù)據(jù)集里有沒有“離群點”。我這里隨便選擇了熱度指數(shù)這個特征,你也可以為其它特征試試?yán)L制箱線圖。

importpandasaspd

importmatplotlib.pyplotasplt

importseabornassns

# 用seaborn畫箱線圖

plt.figure(dpi=500) # 設(shè)置圖形的清晰度

data=pd.concat([df_ads['瀏覽量'],df_ads['熱度指數(shù)']],axis=1) # 瀏覽量和熱度指數(shù)

fig=sns.boxplot(x='熱度指數(shù)',y="瀏覽量",data=data) # 用seaborn的箱線圖畫圖

fig.axis(ymin=0,ymax=800000); # 設(shè)定y軸坐標(biāo)

下圖就是輸出的箱線圖:

箱線圖是由五個數(shù)值點組成,分別是最小值(min)、下四分位數(shù)(Q1)、中位數(shù)(median)、上四分位數(shù)(Q3)和最大值(max)。在統(tǒng)計學(xué)上,這叫做五數(shù)概括。這五個數(shù)值可以清楚地為我們展示數(shù)據(jù)的分布和離散程度。

這個圖中下四分位數(shù)、中位數(shù)、上四分位數(shù)組成一個“帶有隔間的盒子”,就是所謂的箱;上四分位數(shù)到最大值之間建立一條延伸線,就是所謂的線,也叫“胡須”;胡須的兩極就是最小值與最大值;此外,箱線圖還會將離群的數(shù)據(jù)點單獨繪出。

在上面這個箱線圖中,我們不難發(fā)現(xiàn),熱度指數(shù)越高,瀏覽量的中位數(shù)越大。我們還可以看到,有一些離群的數(shù)據(jù)點,比其它的文章瀏覽量大了很多,這些“離群點”就是我們說的“爆款文章”了。

到這里,數(shù)據(jù)可視化工作算是基本完成了。在數(shù)據(jù)可視化之后,下一步就是數(shù)據(jù)的清洗。

(三)數(shù)據(jù)清洗

很多人都把數(shù)據(jù)清洗比作“炒菜”前的“洗菜”,也就是說數(shù)據(jù)越干凈,模型的效果也就越好。清洗的數(shù)據(jù)一般分為4種情況:

第一種是處理缺失的數(shù)據(jù):如果備份系統(tǒng)里面有缺了的數(shù)據(jù),那我們盡量補錄;如果沒有,我們可以剔除掉殘缺的數(shù)據(jù),也可以用其他數(shù)據(jù)記錄的平均值、隨機值或者0值來補值。這個補值的過程叫數(shù)據(jù)修復(fù)。 第二個是處理重復(fù)的數(shù)據(jù):如果是完全相同的重復(fù)數(shù)據(jù)處理,刪掉就行了??扇绻粋€主鍵出現(xiàn)兩行不同的數(shù)據(jù),比如同一個身份證號后面有兩條不同的地址,我們就要看看有沒有其他輔助的信息可以幫助我們判斷(如時戳),要是無法判斷的話,只能隨機刪除或者全部保留。 第三個是處理錯誤的數(shù)據(jù):比如商品的銷售量、銷售金額出現(xiàn)負(fù)值,這時候就需要刪除或者轉(zhuǎn)成有意義的正值。再比如表示百分比或概率的字段,如果值大于1,也屬于邏輯錯誤數(shù)據(jù)。 第四個是處理不可用的數(shù)據(jù):這指的是整理數(shù)據(jù)的格式,比如有些商品以人民幣為單位,有些以美元為單位,就需要先統(tǒng)一。另一個常見例子是把“是”、“否”轉(zhuǎn)換成“1”、“0”值再輸入機器學(xué)習(xí)模型。

那么如何看數(shù)據(jù)集中有沒有臟數(shù)據(jù)呢?

就我們這個項目的數(shù)據(jù)集來說,細(xì)心的你可能在DataFrame圖中已經(jīng)發(fā)現(xiàn),行索引為6的數(shù)據(jù)中“轉(zhuǎn)發(fā)數(shù)”的值是“NaN”,意思是NotANumber。在Python中,它代表無法表示、也無法處理的值。這是典型的臟數(shù)據(jù)。

我們可以通過DataFrame的isna().sum()函數(shù)來統(tǒng)計所有的NaN的個數(shù)。這樣,我們就可以在看看有沒有NaN的同時,也看看NaN出現(xiàn)的次數(shù)。如果NaN過多的話,那么說明這個數(shù)據(jù)集質(zhì)量不好,就要找找數(shù)據(jù)源出了什么問題。

df_ads.isna().sum() # NaN出現(xiàn)的次數(shù)

輸出結(jié)果如下:

點贊數(shù)0 轉(zhuǎn)發(fā)數(shù)37 熱度指數(shù)0 文章評級0 瀏覽量0 dtype:int64

輸出顯示我們的數(shù)據(jù)集中“轉(zhuǎn)發(fā)數(shù)”這個字段有37個NaN值。對于上千條數(shù)據(jù)的數(shù)據(jù)集,這還不算很多。那么該如何處理呢?也很簡單。我們可以用dropna()這個API把出現(xiàn)了NaN的數(shù)據(jù)行刪掉。

df_ads=df_ads.dropna() # 把出現(xiàn)了NaN的數(shù)據(jù)行刪掉

你可能會覺得,我們剛才通過箱線圖找到了離群點(爆款文章),這些算是臟數(shù)據(jù)嗎?這是個很好的問題,而且這個問題并沒有固定的答案。

刪去了離群點,模型針對普通的數(shù)據(jù)會擬合得比較漂亮。但是現(xiàn)實生活中,就是存在著這樣的離群點,讓模型不那么漂亮。如果把這里的離群點刪掉,那模型就不能工作得那么好了。所以,這是一個平衡和取舍的過程。

我們可以訓(xùn)練出包含這些離群點的模型,以及不包含這些離群點的模型,并進行比較。在這里,我建議保留這些“離群點”。

現(xiàn)在,我們就完成了對這個數(shù)據(jù)的簡單清洗。

(四)特征工程

特征工程是一個專門的機器學(xué)習(xí)子領(lǐng)域,而且我認(rèn)為它是數(shù)據(jù)處理過程中最有創(chuàng)造力的環(huán)節(jié),特征工程做得好不好,非常影響機器學(xué)習(xí)模型的效率。

我舉個例子來解釋下什么是特征工程。你知道什么是BMI指數(shù)嗎?它等于體重除以身高的平方,這就是一個特征工程。

什么意思呢?就是說經(jīng)過了這個過程,BMI這一個指數(shù)就替代了原來的兩個特征——體重和身高,而且完全能客觀地描繪我們的身材情況。

因此,經(jīng)過了這個特征工程,我們可以把BIM指數(shù)作為新特征,輸入用于評估健康情況的機器學(xué)習(xí)模型。

你可能會問這樣做的好處是什么?以BMI特征工程為例,它降低了特征數(shù)據(jù)集的維度。維度就是數(shù)據(jù)集特征的個數(shù)。要知道,在數(shù)據(jù)集中,每多一個特征,模型擬合時的特征空間就更大,運算量也就更大。所以,摒棄掉冗余的特征、降低特征的維度,能使機器學(xué)習(xí)模型訓(xùn)練得更快。

這只是特征工程的諸多的妙處之一,此外特征工程還能更好地表示業(yè)務(wù)邏輯,并提升機器學(xué)習(xí)模型的性能。

由于我們這個項目的問題相對簡單,對特征工程的要求并不高,這里暫時不做特征工程。

(五)構(gòu)建特征集和標(biāo)簽集

我們說過,特征就是所收集的各個數(shù)據(jù)點,是要輸入機器學(xué)習(xí)模型的變量。而標(biāo)簽是要預(yù)測、判斷或者分類的內(nèi)容。對于所有監(jiān)督學(xué)習(xí)算法,我們都需要向模型中輸入“特征集”和“標(biāo)簽集”這兩組數(shù)據(jù)。因此,在開始機器學(xué)習(xí)的模型搭建之前,我們需要先構(gòu)建一個特征數(shù)據(jù)集和一個標(biāo)簽數(shù)據(jù)集。

具體的構(gòu)建過程也很簡單,我們只要從原始數(shù)據(jù)集刪除我們不需要的數(shù)據(jù)就行了。在這個項目中,特征是點贊數(shù)、轉(zhuǎn)發(fā)數(shù)、熱度指數(shù)和文章評級,所以只需要從原始數(shù)據(jù)集中刪除“瀏覽量”就行了。

X=df_ads.drop(['瀏覽量'],axis=1) # 特征集,Drop掉標(biāo)簽相關(guān)字段

而標(biāo)簽是我們想要預(yù)測的瀏覽量,因此,我們在標(biāo)簽數(shù)據(jù)集中只保留“瀏覽量”字段:

y=df_ads.瀏覽量 # 標(biāo)簽集

下面我們再看看特征集和標(biāo)簽集里面都有什么數(shù)據(jù)。

X.head() # 顯示前幾行數(shù)據(jù)

y.head() # 顯示前幾行數(shù)據(jù)

因為Notebook一個單元格只能有一個輸出。實際操作需要把顯示兩個數(shù)據(jù)的代碼放在了不同的單元格中。它們的輸出結(jié)果如下圖所示:

可以看到,除了瀏覽量之外,所有其它字段仍然都在特征數(shù)據(jù)集中,而只有瀏覽量被保存在了標(biāo)簽數(shù)據(jù)集中,也就是說原始數(shù)據(jù)集就被拆分成了機器學(xué)習(xí)的特征集和標(biāo)簽集。

無監(jiān)督學(xué)習(xí)算法是不需要這個步驟的,因為無監(jiān)督算法沒有標(biāo)簽。

不過,從原數(shù)據(jù)集從列的維度縱向地拆分成了特征集和標(biāo)簽集后,還需要進一步從行的維度橫向拆分。

因為機器學(xué)習(xí)并不是通過訓(xùn)練數(shù)據(jù)集找出一個模型就結(jié)束了,我們需要用驗證數(shù)據(jù)集看看這個模型好不好,然后用測試數(shù)據(jù)集看看模型在新數(shù)據(jù)上能不能用。

(六)拆分訓(xùn)練集、驗證集和測試集

在拆分之前,我先說明一點,對于學(xué)習(xí)型項目來說,為了簡化流程,經(jīng)常會省略驗證的環(huán)節(jié)。我們今天的項目比較簡單,所以我們也省略了驗證,只拆分訓(xùn)練集和測試集,而此時的測試集就肩負(fù)著驗證和測試雙重功能了。

拆分的時候,留作測試的數(shù)據(jù)比例一般是20%或30%。不過如果你的數(shù)據(jù)量非常龐大,比如超過1百萬的時候,那你也不一定非要留這么多。一般來說有上萬條的測試數(shù)據(jù)就足夠了。這里我會按照80/20的比例來拆分?jǐn)?shù)據(jù)。具體的拆分,我們會用機器學(xué)習(xí)工具包scikit-learn里的數(shù)據(jù)集拆分工具train_test_split來完成:

# 將數(shù)據(jù)集進行80%(訓(xùn)練集)和20%(驗證集)的分割

fromsklearn.model_selectionimporttrain_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值,這樣就保證程序每次運行都分割一樣的訓(xùn)練集和測試集。訓(xùn)練集和測試集每次拆分都不一樣的話,那比較模型調(diào)參前后的優(yōu)劣就失去了固定的標(biāo)準(zhǔn)。

現(xiàn)在,訓(xùn)練集和測試集拆分也完成了,你會發(fā)現(xiàn)原始數(shù)據(jù)現(xiàn)在變成了四個數(shù)據(jù)集,分別是:

特征訓(xùn)練集(X_train)特征測試集(X_test)標(biāo)簽訓(xùn)練集(y_train)標(biāo)簽測試集(y_test)

現(xiàn)在我們完成了,定義問題以及數(shù)據(jù)的收集和預(yù)處理。不明確定義要解決的問題,我們就沒辦法有的放矢地選擇模型。

而數(shù)據(jù)的收集和預(yù)處理雖然看起來沒有模型的選擇和優(yōu)化那么“吸引眼球”,但它其實才是機器學(xué)習(xí)項目成敗的關(guān)鍵。這一步可以分為下圖中的6個小步:

這6步中,尤其是數(shù)據(jù)可視化和特征工程,因為無定法可循,所以很考驗經(jīng)驗,它既是我們對著已有數(shù)據(jù)找感覺的過程,又是下一步把數(shù)據(jù)“喂”給模型之前的必要準(zhǔn)備。

除此之外,還有兩點需要注意:

第一點是,這些子步驟中的次序并不是固定的,比如數(shù)據(jù)可視化和特征工程,很多時候是先可視化,發(fā)現(xiàn)了一些特征工程的思路,然后做特征工程,然后再次可視化。而且有的特征工程比如特征縮放,還必須在拆分?jǐn)?shù)據(jù)之后做; 第二點,這些子步驟在一個特定的機器學(xué)習(xí)項目中,可能不需要全部用到。比如說無監(jiān)督學(xué)習(xí)項目,就不需要創(chuàng)建特征集和標(biāo)簽集這個步驟,一般也不需要用到驗證集和測試集。

第三步:選擇算法并建立模型

在這一步中,我們需要先根據(jù)特征和標(biāo)簽之間的關(guān)系,選出一個合適的算法,并找到與之對應(yīng)的合適的算法包,然后通過調(diào)用這個算法包來建立模型。

選算法的過程很考驗數(shù)據(jù)科學(xué)家們的經(jīng)驗,具體到我們這個項目里,從上文中可以知道,我們這個數(shù)據(jù)集里的某些特征和標(biāo)簽之間,存在著近似線性的關(guān)系。而且,這個數(shù)據(jù)集的標(biāo)簽是連續(xù)變量,因此,適合用回歸分析來尋找從特征到標(biāo)簽的預(yù)測函數(shù)。

所謂回歸分析(regressionanalysis),就是確定兩種或兩種以上變量間相互依賴的定量關(guān)系的一種統(tǒng)計分析,說白了就是當(dāng)自變量變化的時候,研究一下因變量是怎么跟著變化的,它可以用來預(yù)測客流量、降雨量、銷售量等。

不過,回歸分析的算法有很多種,比如說線性回歸,多項式回歸,貝葉斯回歸等等,那具體該選哪個呢?其實,這是根據(jù)特征和標(biāo)簽之間的關(guān)系來決定的。

在前面的可視化過程中,我們推測特征和標(biāo)簽可能存在線性關(guān)系,并且用散點圖簡單做了驗證。所以這里,我們就選擇用線性回歸算法來建模。

線性回歸算法是最簡單、最基礎(chǔ)的機器學(xué)習(xí)算法,它其實就是給每一個特征變量找參數(shù)的過程。我想你一定熟悉一元線性回歸的公式:

對于一元線性回歸來說,它的內(nèi)部參數(shù)就是未知的斜率和截距。只不過在機器學(xué)習(xí)中,我們把斜率a叫做權(quán)重(weight),用英文字母w代表,把截距b叫做偏置(bias),用英文字母b代表。所以機器學(xué)習(xí)中一元線性回歸的公式也寫成:

而在我們這個項目中,數(shù)據(jù)集中有4個特征,所以就是:

因此,我們的模型就會有5個內(nèi)部參數(shù),也就是4個特征的權(quán)重和一個偏置(截距)需要確定。不過這些公式的具體代碼實現(xiàn),都不用我們自己完成,它們?nèi)糠庋b在工具包里了。你只要對算法的原理有個印象就行了。

確定好算法后,我們接著來看一下調(diào)用什么樣的算法包建立模型比較合適。

對于機器學(xué)習(xí)來說,最常用的算法工具包是scikit-learn,簡稱sklearn,它是使用最廣泛的開源Python機器學(xué)習(xí)庫,堪稱機器學(xué)習(xí)神器。sklearn提供了大量用于數(shù)據(jù)挖掘的機器學(xué)習(xí)工具,覆蓋數(shù)據(jù)預(yù)處理、可視化、交叉驗證和多種機器學(xué)習(xí)算法。

雖然我們已經(jīng)選定使用線性回歸算法,但是在sklearn中又有很多線性回歸算法包,比如說基本的線性回歸算法LinearRegression,以及在它的基礎(chǔ)上衍生出來的Lasso回歸和Ridge回歸等。

那哪一個才是適合我們這個項目的算法包呢?其實,我們一般選算法包的方法是從能夠解決該問題的最簡單的算法開始嘗試,直到得到滿意的結(jié)果為止。對于這個項目,我們選擇LinearRegression,它也是機器學(xué)習(xí)中最常見、最基礎(chǔ)的回歸算法包。其它回歸算法包,未來我會慢慢給你介紹。

調(diào)用LinearRegression建立模型非常簡單,兩行代碼就可以搞定:

fromsklearn.linear_modelimportLinearRegression # 導(dǎo)入線性回歸算法模型

# 類似于創(chuàng)建一個Python類

linereg_model=LinearRegression() # 使用線性回歸算法創(chuàng)建模型

可以看到,我把這個線性回歸模型命名為了“l(fā)inereg_model”。那到這里,我們算不算是建立好模型了呢?是的,模型已經(jīng)創(chuàng)建出來了,我們可以開始訓(xùn)練它了。不過,有一點需要指出,建立模型時,你通常還需要了解它有哪些外部參數(shù),同時指定好它的外部參數(shù)的值。

模型的參數(shù)有兩種:內(nèi)部參數(shù)和外部參數(shù)。內(nèi)部參數(shù)是屬于算法本身的一部分,不用我們?nèi)斯泶_定,剛才提到的權(quán)重w和截距b,都是線性回歸模型的內(nèi)部參數(shù);而外部參數(shù)也叫做超參數(shù),它們的值是在創(chuàng)建模型時由我們自己設(shè)定的。

對于LinearRegression模型來講,它的外部參數(shù)主要包括兩個布爾值:

fit_intercept,默認(rèn)值為True,代表是否計算模型的截距。normalize,默認(rèn)值為False,代表是否對特征X在回歸之前做規(guī)范化。

不過呢,對于比較簡單的模型來說,默認(rèn)的外部參數(shù)設(shè)置也都是不錯的選擇,所以,我們不顯式指定外部參數(shù)而直接調(diào)用模型,也是可以的。在上面的代碼中,我就是在創(chuàng)建模型時直接使用了外部參數(shù)的默認(rèn)值。

第四步:訓(xùn)練模型

訓(xùn)練模型就是用訓(xùn)練集中的特征變量和已知標(biāo)簽,根據(jù)當(dāng)前樣本的損失大小來逐漸擬合函數(shù),確定最優(yōu)的內(nèi)部參數(shù),最后完成模型。雖然看起來挺復(fù)雜,但這些步驟,我們都通過調(diào)用fit方法來完成。

fit方法是機器學(xué)習(xí)的核心環(huán)節(jié),里面封裝了很多具體的機器學(xué)習(xí)核心算法,我們只需要把特征訓(xùn)練數(shù)據(jù)集和標(biāo)簽訓(xùn)練數(shù)據(jù)集,同時作為參數(shù)傳進fit方法就行了。

linereg_model.fit(X_train,y_train) # 用訓(xùn)練集數(shù)據(jù),訓(xùn)練機器,擬合函數(shù),確定內(nèi)部參數(shù)

運行該語句后的輸出如下:

LinearRegression()

這樣,我們就完成了對模型的訓(xùn)練。你可能會覺得很奇怪,既然訓(xùn)練模型是機器學(xué)習(xí)的核心環(huán)節(jié),怎么只有一句代碼?其實這就是我反復(fù)強調(diào)過的,由于優(yōu)秀的機器學(xué)習(xí)庫的存在,我們可以用一兩行語句實現(xiàn)很強大的功能。所以,不要小看上面那個簡單的fit語句,這是模型進行自我學(xué)習(xí)的關(guān)鍵過程。

在這個過程里,fit的核心就是減少損失,使函數(shù)對特征到標(biāo)簽的模擬越來越貼切。那么它具體是怎么減少損失呢?這里我畫了一張圖片展示模型從很不靠譜到比較靠譜的過程。

這個擬合的過程,同時也是機器學(xué)習(xí)算法優(yōu)化其內(nèi)部參數(shù)的過程。而優(yōu)化參數(shù)的關(guān)鍵就是減小損失。

那什么是損失呢?它其實是對糟糕預(yù)測的懲罰,同時也是對模型好壞的度量。損失也就是模型的誤差,也稱為成本或代價。名字雖多,但都是一個意思,就是當(dāng)前預(yù)測值和真實值之間的差距的體現(xiàn)。它是一個數(shù)值,表示對于單個樣本而言模型預(yù)測的準(zhǔn)確程度。如果模型的預(yù)測完全準(zhǔn)確,則損失為0;如果不準(zhǔn)確,就有損失。

在機器學(xué)習(xí)中,我們追求的當(dāng)然是比較小的損失。不過,模型好不好,還不能僅看單個樣本,還要針對所有數(shù)據(jù)樣本,找到一組平均損失“較小”的函數(shù)模型。樣本的損失大小,從幾何意義上基本可以理解為預(yù)測值和真值之間的幾何距離。平均距離越大,說明誤差越大,模型越離譜。在下面這個圖中,左邊是平均損失較大的模型,右邊是平均損失較小的模型,模型所有數(shù)據(jù)點的平均損失很明顯大過右邊模型。

因此,針對每一組不同的參數(shù),機器都會基于樣本數(shù)據(jù)集,用損失函數(shù)算一次平均損失。而機器學(xué)習(xí)的最優(yōu)化過程,就是逐步減小訓(xùn)練集上損失的過程。具體到我們今天這個回歸模型的擬合,它的關(guān)鍵環(huán)節(jié)就是通過梯度下降,逐步優(yōu)化模型的參數(shù),使訓(xùn)練集誤差值達(dá)到最小。這也就是我們剛才講的那個fit語句所要實現(xiàn)的最優(yōu)化過程。

因此,針對每一組不同的參數(shù),機器都會基于樣本數(shù)據(jù)集,用損失函數(shù)算一次平均損失。而機器學(xué)習(xí)的最優(yōu)化過程,就是逐步減小訓(xùn)練集上損失的過程。具體到我們今天這個回歸模型的擬合,它的關(guān)鍵環(huán)節(jié)就是通過梯度下降,逐步優(yōu)化模型的參數(shù),使訓(xùn)練集誤差值達(dá)到最小。這也就是我們剛才講的那個fit語句所要實現(xiàn)的最優(yōu)化過程。

在這里面,線性回歸中計算誤差的方法很好理解,就是數(shù)據(jù)集中真值與預(yù)測值之間的殘差平方和。那梯度下降又是怎么一回事呢?為了讓你直觀地理解,我用一張圖來展示一下,梯度下降是怎么一步一步地走到損失曲線中的最小損失點的。

就像圖里這樣,梯度下降其實就和下山一樣。你可以想象一下,當(dāng)你站在高處,你的目標(biāo)就是找到一系列的參數(shù),讓訓(xùn)練數(shù)據(jù)集上的損失值最小。那么你該往哪走才能保證損失值最小呢?關(guān)鍵就是通過求導(dǎo)的方法,找到每一步的方向,確保總是往更小的損失方向前進。

所以,你可以看出方向是有多么的重要。機器學(xué)習(xí)最優(yōu)化之所以能夠擬合出最佳的模型,就是因為能夠找到前進方向,你看,不僅我們?nèi)诵枰较颍BAI也需要正確的方向。

那到這里為止,我們已經(jīng)完成了模型的建立和訓(xùn)練,接下來,一起看看怎么對這個訓(xùn)練好的模型進行評估和優(yōu)化,讓它盡可能精準(zhǔn)地估計出文章瀏覽量。

第五步:模型的評估和優(yōu)化

我們剛才說,梯度下降是在用訓(xùn)練集擬合模型時最小化誤差,這時候算法調(diào)整的是模型的內(nèi)部參數(shù)。而在驗證集或者測試集進行模型效果評估的過程中,我們則是通過最小化誤差來實現(xiàn)超參數(shù)(模型外部參數(shù))的優(yōu)化。

對此,機器學(xué)習(xí)工具包(如scikit-learn)中都會提供常用的工具和指標(biāo),對驗證集和測試集進行評估,進而計算當(dāng)前的誤差。比如R方或者MSE均方誤差指標(biāo),就可以用于評估回歸分析模型的優(yōu)劣。

不過呢,在開始評估模型之前,我想請你思考一下:在我們這5個實戰(zhàn)步驟里面,并沒有“使用模型預(yù)測瀏覽量”這個環(huán)節(jié),這是為什么呢?其實這個環(huán)節(jié)已經(jīng)包含在第5步“模型性能的評估和優(yōu)化”之中了,并且是我們在第5步中首先要去實現(xiàn)的。

具體來說,在“模型的評估和優(yōu)化”這一步中,當(dāng)我們預(yù)測完測試集的瀏覽量后,我們要再拿這個預(yù)測結(jié)果去和測試集已有的真值去比較,這樣才能夠求出模型的性能。而這整個過程也同樣是一個循環(huán)迭代的過程,我把這個循環(huán)過程總結(jié)成了下面的圖,你可以看看:

對于這個項目來說,預(yù)測測試集的瀏覽量,只需要用訓(xùn)練好的模型linereg_model中的predict方法,在X_test(特征測試集)上進行預(yù)測,這個方法就會返回對測試集的預(yù)測結(jié)果。

y_pred=linereg_model.predict(X_test)#預(yù)測測試集的Y值

在幾乎所有的機器學(xué)習(xí)項目中,你都可以用predict方法來進行預(yù)測,它就是用模型在任意的同類型數(shù)據(jù)集上去預(yù)測真值的,可以應(yīng)用于驗證集、測試集,當(dāng)然也可以應(yīng)用于訓(xùn)練集本身。

這里我要說明一下,為了簡化流程,我們并沒有真正進行驗證和測試的多重循環(huán)。因此,在這個項目中,X_test既充當(dāng)了測試集,也充當(dāng)了驗證集。

拿到預(yù)測結(jié)果后,我們再通過下面的代碼,把測試數(shù)據(jù)集的原始特征數(shù)據(jù)、原始標(biāo)簽真值,以及模型對標(biāo)簽的預(yù)測值組合在一起進行顯示、比較。

df_ads_pred=X_test.copy() # 預(yù)測集特征數(shù)據(jù)

df_ads_pred['瀏覽量真值']=y_test # 測試集標(biāo)簽真值

df_ads_pred['瀏覽量預(yù)測值']=y_pred # 測試集標(biāo)簽預(yù)測值

df_ads_pred # 顯示數(shù)據(jù)

輸出如下結(jié)果:

可以看出,瀏覽量預(yù)測值是比較接近于真值的。而且對于一些文章,這個模型的預(yù)測得非常準(zhǔn)確,比如編號第145號數(shù)據(jù),其實際瀏覽量為119501,預(yù)測瀏覽量為110710。這就是一個很棒的結(jié)果。

如果你想看看現(xiàn)在的模型長得什么樣?你可以通過LinearRegression的coef_和intercept_屬性打印出各個特征的權(quán)重和模型的偏置來。它們也就是模型的內(nèi)部參數(shù)。

print("當(dāng)前模型的4個特征的權(quán)重分別是:",linereg_model.coef_)

print("'當(dāng)前模型的截距(偏置)是:",linereg_model.intercept_)

輸入如下:

當(dāng)前模型的4個特征的權(quán)重分別是:[48.0839522434.7306222929730.133124892949.62196343] 當(dāng)前模型的截距(偏置)是:-127493.90606857173

這也就是說,我們現(xiàn)在的模型的線性回歸公式是:

y=48.08x1(點贊)+34.73x2(轉(zhuǎn)發(fā))+29730.13x3(熱度)+2949.62x4(評級)?127493.91

不過到這里,整個機器學(xué)習(xí)項目并沒有結(jié)束,我們最后還要給出當(dāng)前這個模型的評估分?jǐn)?shù):

print("線性回歸預(yù)測評分",linereg_model.score(X_test,y_test))#評估模型

在機器學(xué)習(xí)中,常用于評估回歸分析模型的指標(biāo)有兩種:R方分?jǐn)?shù)和MSE指標(biāo),并且大多數(shù)機器學(xué)習(xí)工具包中都會提供相關(guān)的工具。對此,你無需做過多了解,只需要知道我們這里的score這個API中,選用的是R方分?jǐn)?shù)來評估模型的就可以了。

最后我們得到這樣的結(jié)果:

線性回歸預(yù)測評分0.740552064611524

可以看到,R方值約為0.74。那這意味著什么呢?

一般來說,R方的取值在0到1之間,R方越大,說明所擬合的回歸模型越優(yōu)?,F(xiàn)在我們得到的R方值約為0.74,在沒有與其它模型進行比較之前,我們實際上也沒法確定它是否能令人滿意。

因為分?jǐn)?shù)的高低,與數(shù)據(jù)集預(yù)測的難易程度、模型的類型和參數(shù)都有關(guān)系。而且,R方分?jǐn)?shù)也不是線性回歸模型唯一的評估標(biāo)準(zhǔn)。

不過你需要知道的是,如果模型的評估分?jǐn)?shù)不理想,我們就需要回到第3步,調(diào)整模型的外部參數(shù),重新訓(xùn)練模型。要是得到的結(jié)果依舊不理想,那我們就要考慮選擇其他算法,創(chuàng)建全新的模型了。如果很不幸,新模型的效果還是不好的話,我們就得回到第2步,看看是不是數(shù)據(jù)出了問題。

這也是為什么,我一直強調(diào)機器學(xué)習(xí)項目是一個循環(huán)迭代的過程,優(yōu)秀的模型都是一次次迭代的產(chǎn)物。

當(dāng)模型通過了評估,就可以去解決實際問題了,機器學(xué)習(xí)項目也算是基本結(jié)束。

總結(jié)

我們通過一個預(yù)測軟文瀏覽量的實戰(zhàn)項目,了解了機器學(xué)習(xí)項目要經(jīng)歷5個步驟。第一步就是通過定義問題來明確我們的項目目標(biāo);第二步是數(shù)據(jù)的收集和預(yù)處理,這一步的重點是把數(shù)據(jù)轉(zhuǎn)換成機器學(xué)習(xí)可處理的格式,這樣我們就可以在第三步中針對問題選定適宜的算法,來建立模型了。

有了模型后,我們要在接下來的第四步中訓(xùn)練模型、擬合函數(shù)。最后,再對訓(xùn)練好的模型進行評估和優(yōu)化。對于這最后一步,也就是第5步,我們的重點是反復(fù)測評,找到最優(yōu)的超參數(shù),確定最終模型。

柚子快報激活碼778899分享:人工智能 機器學(xué)習(xí)實戰(zhàn)練手項目

http://yzkb.51969.com/

參考鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18647084.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄