從零開始學機器學習——瞭解分類演算法

努力的小雨發表於2024-10-14

分類演算法

首先給大家介紹一個很好用的學習地址:https://cloudstudio.net/columns

分類演算法是監督學習的一種重要方法,它與迴歸演算法在許多方面有相似之處。監督學習的核心目標是利用已有的資料集進行預測,無論是數值型資料還是類別型資料。具體而言,分類演算法主要用於將輸入資料歸類為不同的類別,通常可以分為兩大類:二元分類和多元分類。

理解這一過程其實並不複雜,舉例來講如何將一系列郵件區分為正常郵件與垃圾郵件。這一原理在我們生活中也隨處可見,比如分類垃圾箱的使用。無論是郵件的分類還是垃圾的處理,最終的結果都是在於對不同型別的內容進行明確的定性區分。

image

儘管這個問題看起來比較簡單,但我有一個疑問:在我們之前學習迴歸演算法的過程中,曾經講解過邏輯迴歸。為什麼邏輯迴歸被歸類為分類演算法,而不是迴歸演算法呢?

邏輯迴歸:迴歸 VS 分類

儘管名字中帶有“迴歸”二字,邏輯迴歸實際上執行的是分類任務。因此,它被歸類為一種分類演算法。

我們在講解邏輯迴歸時,是有講解到一個數學知識點的,一個Sigmoid 函式,再來複習一下,這個函式有幾個特點,sigmoid 可以將資料壓縮到[0, 1]之間,它經過一個重要的點(0, 0.5)。這樣,將輸出壓縮到[0,1]之間,0.5作為閾值,大於0.5作為一類,小於0.5作為另一類。

image

當然了邏輯迴歸通常也有多元分類。這裡就不在贅述了。

今天,我們將透過一個官方示例進行詳細講解。這個示例涉及分析一系列原材料,以判斷這些原材料可以用來製作哪種國家的菜餚。顯然,這是一個多元分類問題,因為涉及的國家種類非常多。

準備資料

接下來,我們將重點講解今天的主要任務,即資料準備。在經過前面關於迴歸的章節後,我們已經掌握了資料清洗的基本步驟,包括讀取檔案資料、刪除多餘欄位和去除空值資料這三個主要環節。

今天,我們仍然會遵循這些步驟,但我們的目標將側重於資料的平衡性。因為在實際資料集中,某些類別可能存在過多的樣本,而另一些類別則可能樣本較少,這種不平衡現象會對後續的預測分類產生顯著的偏差。

因此,我們將特別關注如何對資料進行合理的平衡處理,以提高模型的預測效能。

匯入資料

我們將繼續使用官方提供的資料示例進行匯入。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE

df  = pd.read_csv('../data/cuisines.csv')
df.head()

image

在這裡,我們展示了幾行資料樣本,其中用0和1表示某道菜使用了哪些原料。具體來說,0表示未使用該原料,而1表示使用了該原料。由於資料集中包含的原料數量大約有384個,為了簡潔起見,對中間部分的資料進行了摺疊顯示。

接下來,我們將演示資料集中存在的不平衡情況。由於我們的主要關注點是不同國家菜餚的出現機率,因此確保每個國家的資料儘可能一致是至關重要的。接下來,讓我們檢視目前的資料分佈情況。

df.cuisine.value_counts().plot.barh()

由於國家資料儲存在“cuisine”列中,因此我們只需對該列的值進行統計即可,具體情況如圖所示:

image

去除資料

因為我們需要保留所有列的資料,每一列都對我們的分析具有重要意義,因此在進行資料平衡之前,我們需要先去除一些無用的行資料。為什麼有些行資料沒用呢?

在某些菜餚中使用了米飯這一原材料,但由於米飯在資料中無法有效區分不同菜餚,每個地區都會使用大米作為基本原材料,導致難以準確預測菜餚的所屬國家。因此,為了提高模型的預測準確性,我們需要先刪除這些容易引起混淆的行資料。

之後,再檢查每個國家的資料是否平衡,以確保模型能夠更好地學習和區分不同國家的菜餚。

def create_ingredient_df(df):
    ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
    ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
    ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
    inplace=False)
    return ingredient_df

為此單獨封裝了一個函式,接下來我來詳細解釋一下這個函式的設計和實現。

這個函式的主要目的是接收一個 DataFrame df 作為輸入引數,並處理該 DataFrame,以建立一個新的 DataFrame ingredient_df,其中包含各類食材的出現頻率。

在具體的業務邏輯中,函式的處理過程較為複雜。首先,它將輸入的行列進行轉換,刪除那些無用的國家和序號資訊。接下來,函式會對剩餘的每一行食材進行求和操作,以計算出各個食材的總出現頻率。最後,它會篩選出頻率不為零的食材,並按照頻率進行排序,最終返回處理後的 DataFrame ingredient_df。

接下來,我們需要逐一檢查每個國家的菜餚,識別出使用相同原料的重複行,並且這些原料的使用頻率還相對較高。

thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()

japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()

chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()

indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()

korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()

透過這種方式,我們能夠直觀地檢視和分析資料。為了便於理解和比較,我們將重點展示兩個圖表,其他圖表則請自行檢視和分析。

中國菜餚用到的原料數量排行:

image

印度菜餚用到的原料數量排行:

image

在資料處理過程中,我們注意到“garlic”(大蒜)和“ginger”(生薑)在資料集中頻繁出現。因此,為了避免這些高頻食材對分析結果的干擾,我們決定去除包含這些食材的菜餚。

此外,透過對其他國家菜餚的對比分析,我們發現“rice”(米飯)也是一個高重複度的原料。為了確保分析的準確性和多樣性,我們最終決定從資料集中去除包含這三類原料(大蒜、生薑和米飯)的菜餚。

feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()

接下來,我們可以看下當前的資料分佈情況,發現其仍然存在不平衡的問題。

image

平衡資料

這裡介紹一個新方法——SMOTE(Synthetic Minority Over-sampling Technique)

SMOTE是一種常用於機器學習中的技術,特別是在處理分類問題時,當資料集中的某個類別樣本數量遠少於其他類別時,可以採用此方法。換句話來講就是根據輸入資料的特徵去造假資料而已。目的就是解決資料不平衡問題。

oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)

造完資料後,將城市標籤資料和原料資料合併:

transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')

最後我們的資料分佈則會更加平衡,這樣對於機器訓練來說也有一定好處:

transformed_df.cuisine.value_counts().plot.barh()

image

資料準備工作已全部完成,接下來我們將在下一章節深入探討如何利用這些資料構建一個有效的模型。

總結

分類演算法在資料科學和機器學習的領域中扮演著至關重要的角色,它不僅幫助我們從複雜的資料中提取出有意義的資訊,還使我們能夠在實際應用中做出更準確的決策。

透過對文字進行深入探討,我們不僅理解了分類演算法的核心邏輯,還透過一系列系統化的操作對資料進行了有效的清洗和均衡處理,從而為後續分析奠定了堅實的基礎。

下一步,我們將基於本章節經過清洗處理的資料,進行模型的構建與最佳化。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章