1. 項目介紹
? ? ? 本項目從kaggle平臺上下載了數據集,該數據集包含了3萬多首來自Spotify API 的歌曲,共有23個特征。首先對數據集進行預處理,如重復行、缺失值、標準化處理等。再對預處理后的數據進行探索性分析,觀察各變量的分布情況,各變量之間是否存在關系,如線性關系、相關性等。然后根據探索分析的結果,進行歌曲分類和流行度預測。歌曲分類依次用了決策樹分類器、隨機森林分類器、xgboost分類器進行分類,再根據結果比較分析了哪個分類器效果好。歌曲流行度預測選用隨機森林回歸器和梯度提升回歸器對歌曲流行度進行預測,使用sklearn中的Grid Search方法進行最佳超參數組合的搜索,得到最佳模型。最后分析在最佳模型中,各個特征的貢獻率。
2. 數據介紹
該數據集共有32833首歌曲的相關數據信息,共有23個特征,具體如表1。
表格 1 變量特征
變量名 | 類型 | 含義 | 變量名 | 類型 | 含義 |
track_id | object | 歌曲id | track_name | object | 歌曲名稱 |
track_artist | object | 歌曲家 | track_popularity | int64 | 歌曲人氣 |
track_album_id | object | 專輯id | track_album _name | object | 專輯名稱 |
track_album _release_data | object | 專輯發行日期 | playlist_name | object | 播放列表名稱 |
playlist_id | object | 播放列表id | playlist_genre | object | 播放列表類型 |
playlist_subgenre | object | 播放列表子流派 | danceability | float64 | 可舞性 |
energy | float64 | 強度和活動的感知量度 | key | int64 | 音階 |
loudness | float64 | 響度 | mode | int64 | 曲目的模態 |
speechiness | float64 | 語音類型 | acousticness | float64 | 聲學 |
instrumentalness | float64 | 是否為純音樂 | liveness | float64 | 是否現場 |
valence | float64 | 是否積極 | tempo | float64 | 平均節奏時間 |
duration_ms | int64 | 曲目時間 |
共有10個object類型的變量,9個float型變量,4個int型變量。查看該數據集前5行數據,如圖1、圖2。
圖 1數據集前5行數據
圖 2 數據集前5行數據
3. 數據預處理方法
? ? ? 先導入該數據集,再進行相應的數據預處理,然后進行探索性數據分析
3.1 數據預處理
? ? ? 數據預處理的作用是對原始數據進行清洗、轉換和集成,以便于后續的數據分析和建模工作。數據清洗,可以去除數據中的噪聲、異常值和缺失值,以提高數據的質量和準確性。數據標準化,對數據進行標準化處理,以消除不同特征之間的量綱差異,提高數據的可比性和可解釋性。通過數據預處理,可以提高數據的質量和準確性,減少數據分析和建模過程中的誤差和偏差,從而提高數據分析和建模的效果和準確性。
? ? ? 經過查看數據集的前5行,發現只需要處理該數據集是否有重復行、重復值、缺失值,無需進行數據降維、數據轉換等。
3.1.1 處理重復行
? ? ? 首先查看數據集中是否存在重復行,重復行數據增加了數據的冗余,屬于無效數據,應該將其刪除。使用代碼“df.duplicated().sum()”查看,結果如圖3。
圖 3 重復行結果
發現該數據集并沒有重復行,因此無需進行多余的處理。
3.1.2 處理缺失值
? ? ? 缺失值會導致數據不完整,處理缺失值可以提高數據質量;缺失值可能會導致數據分布的偏移,處理缺失值可以減少這種偏差,使數據更符合真實情況;缺失值會影響模型的訓練和預測結果,處理缺失值可以提高模型的性能和準確度;處理缺失值可以通過插補或預測的方式填充缺失值,從而保留數據中的重要信息,避免丟失有價值的數據。處理缺失值時,可以采用直接刪除缺失值、插補缺失值、使用回歸模型預測缺失值、使用聚類方法填充缺失值等方法。
在本項目中先使用代碼“df.isnull().sum()”,檢查該數據集是否有缺失值,結果如圖4。
圖 4 缺失值結果
發現變量“track_name”、“track_artist”、“track_album_name”,均有5個缺失值,使用插補法進行填充缺失值,將缺失值都填充為N/A。結果如圖5
圖? 5 缺失值填充后結果
缺失值插補完成,數據集中已無缺失值。
3.2 數據探索性分析
? ? ? ?雖然數據集已經處理完成了,但是并不清楚各變量的分布情況,及相互之間的關系,先進行一些探索性分析,為后續的分析、建模奠定基礎。
? ? ? ?首先查看變量“playlist_genre”的分布情況,即播放列表中各流派的占比情況,如圖6。
圖 6 播放列表中各流派占比餅狀圖
從餅狀圖結果來看,在播放列表中的各流派的占比情況相差不大,較為均勻。
接著分析在播放列表中的各流派的的人氣情況,如圖7、圖8。
圖 7 各流派人氣情況
圖 8 各流派人氣分布條形圖
從結果來看,各流派的人氣中位數相差不大,其中最受歡迎的是latin流派,相對不受歡迎的是edm流派;其中rock、r&b、pop受歡迎的范圍相對于其他三個流派較廣。
再分析變量'energy'、'danceability'、'valence'在不同的音樂流派中是否有關聯、區別,可以幫助我們發現數據中的模式、離群值和異常值,分析結果如圖9。
圖 9 各流派在不同特征上的關系圖
從結果上可以得出,edm流派的曲目的活力最強,讓人聽了精力充沛;這6種流派的音樂,可舞性較好,都比較適合作為跳舞的背景音樂;edm流派的曲目偏消極一點,其他5種流派的大多數曲目偏中性,少部分既有消極的又有積極的。edm流派的律動性最好。
其次分析數值型變量,分別統計各個變量不同取值的個數,然后繪制圖形觀察其分布狀況,如是否存在有明顯的線性關系。其分析結果如圖10。
圖 10 數值型變量的線性圖
從運行結果來看,這些數值型變量都不存在一元線性關系,但變量danceability、energy、valence、duration存在比較明顯的正態分布。如變量danceability其值主要分布在0.6-0.8,表明該數據集中的曲目,大多都具有可舞性,可舞性是根據音樂元素的組合,如節奏、節奏穩定性、節拍強度和整體規律性等,來描述曲目適合跳舞的程度,即表明大多數曲目節奏、律動較好。
再用小提琴圖來分析不同音樂流派的能量(Energy)的分布情況,得到的結果如圖11。
圖 11 不同音樂流派的energy分布小提琴圖
從結果來看,pop搖滾樂和edm電舞曲往往更有活力,r&b歌曲通常是最沒有活力的,這也驗證了上面的結論edm流派的音樂的可舞性是最強的。
分析不同年份專輯的發行量情況,用條形圖來展示,如圖12。
從結果來看,2013-2019年專輯的發行量,不斷增加,并且在2019年激增,約為2018年的專輯發行量的3倍,但在2020年又顯著下降,猜測2019年可能發生了促進專輯發行的大事件。
然后分析各變量隨年份的變化趨勢,如圖12。
圖 12各變量隨時間的變化趨勢
從結果來看,隨著時間的移動,該數據集中整體的聲學在下降,特別是在1980年后,波動較為平緩;曲目的整體可舞性在上升,音樂的律動性越來越強;歌曲是否為現場的音頻整體變化不大;歌曲中含有口語的占比在1970-2000年顯著增加,整體的波動較大。
然后繪制散點圖,來觀察不同變量之間兩兩之間的關系,結果如圖13。
圖 13 散點圖
從結果來看,發現各特征兩兩之間并無明顯線性關系,所以在后續的類別和流行度預測的模型中無需剔除變量。
最后繪制各特征之間的熱力圖,如圖14所示。
圖 14 各特征之間熱力圖
發現除了loudness與energy,acousticness與energy之間有較強的相關性后,其他變量兩兩之間均無明顯的相關性。因此在后續的建模中,應該考慮loudness與energy,acousticness與energy之間的相關性。弱相關性表明,預測曲目受歡迎程度可能受到當前數據集范圍之外的因素組合的影響。由于 track_populariy 和 duration_ms 之間的相關性為 -0.14,因此較長的歌曲與平均略低的曲目受歡迎程度相關的趨勢較弱。然而,這種關系并不牢固,其他因素可能會影響整體情況。
看起來track_popularity與給定的任何功能都沒有很強的相關性。
隨著歌曲響度的增加,歌曲的能量也可能會增加。相反,如果響度降低,能量更有可能降低。由于 track_populariy 和 duration_ms 之間的相關性為 -0.14,因此較長的歌曲與平均略低的曲目受歡迎程度相關的趨勢較弱。然而,這種關系并不牢固,其他因素可能會影響整體情況。基于-0.15的相關系數,器樂性較高的歌曲與平均曲目受歡迎程度略低的趨勢較弱。但是,這種關系并不牢固,其他因素可能會在決定曲目受歡迎程度方面發揮作用。
4. 構建模型方法
基于前面的探索性分析,我們對該數據集進行歌曲流派的分類和歌曲流行度的預測。
4.1 歌曲流派分類
歌曲流派分類我們分別采用決策樹分類器、隨機森林分類器、xgboost分類器三種機器學習方法進行分類。
4.1.1 決策樹分類器
決策樹分類器是一種基于樹結構的機器學習算法,用于解決分類問題。它通過對數據集進行遞歸分割,構建一個樹形結構的分類模型。
(1)原理:
(a)決策樹的根節點表示整個數據集,每個內部節點表示一個特征,每個葉節點表示一個類別。
(b)決策樹的構建過程是一個遞歸的過程,每次選擇一個最優的特征進行分割,使得分割后的子集中的樣本盡可能屬于同一類別。
(c)決策樹的構建過程會根據特征的不同取值進行分割,直到滿足停止條件,例如達到最大深度、樣本數量小于閾值等。
(2)實現步驟:
(a)選擇一個合適的特征選擇度量指標,例如信息增益、信息增益比、基尼指數等。
(b)根據特征選擇度量指標,選擇最優的特征進行分割。
(c)根據選擇的特征的不同取值,將數據集分割成多個子集。
(d)對每個子集遞歸地重復步驟2和步驟3,直到滿足停止條件。
(e)構建完整的決策樹后,可以使用決策樹進行分類預測。
決策樹分類器的優點包括易于理解和解釋、能夠處理離散和連續特征、能夠處理多類別問題等。然而,決策樹分類器也存在一些缺點,例如容易過擬合、對輸入數據的變化敏感等。因此,在實際應用中,可以通過剪枝、集成學習等方法來改進決策樹分類器的性能。
從前面分析來看,先將該數據集中的數值型變量全部加入到特征工程中,再選出最優特征,然后將數據集按照二八比例分為測試集和訓練集,最后進行調參訓練模型,得到結果如圖15。
圖 15決策樹分類器結果
使用該方法得到的結果并不好,準確度約為0.47。
4.1.2 隨機森林分類器
隨機森林是一種集成學習方法,它通過組合多個決策樹來進行分類或回歸。
(1)原理:
(a)隨機森林由多個決策樹組成,每個決策樹都是獨立訓練的。
(b)每個決策樹的訓練集是通過有放回抽樣(bootstrap)從原始訓練集中抽取的。
(c)在每個節點上,決策樹選擇最佳的特征來進行分割,分割依據可以是信息增益、基尼系數等。
(d)每個決策樹的分割過程會一直進行,直到達到預定的停止條件,例如達到最大深度或節點中的樣本數小于某個閾值。
(e)預測時,隨機森林中的每個決策樹都會進行預測,最終的預測結果是通過投票或取平均值來確定的。
(2)實現步驟:
(a)準備訓練集和測試集。
(b)根據需要設置隨機森林的參數,例如決策樹的數量、最大深度等。
(c)對于每個決策樹:①從訓練集中有放回地抽取樣本,構建決策樹。②在每個節點上選擇最佳的特征進行分割。③重復步驟①和②,直到達到停止條件。
(d)對于每個測試樣本,通過投票或取平均值來確定最終的預測結果。
(e)計算預測結果的準確率或其他評估指標。
4.1.3 xgboost分類器
xgboost(eXtreme Gradient Boosting)是一種基于梯度提升樹的機器學習算法,它在許多數據科學競賽中表現出色。XGBoost結合了梯度提升樹和正則化技術,具有高效性和準確性。
(1)原理如下: (a)初始化模型:將所有樣本的預測值初始化為一個常數,通常為樣本標簽的均值。(b)計算損失函數的梯度和二階導數:根據當前模型的預測值和樣本標簽,計算損失函數的一階導數(梯度)和二階導數。(c)選擇最佳分割點:對每個特征,根據樣本的梯度和二階導數,選擇最佳的分割點,將樣本劃分為左右兩個子節點。(d)計算葉子節點權重:根據樣本的梯度和二階導數,計算每個葉子節點的權重。(e)更新模型:根據葉子節點權重,更新模型的預測值。(f)迭代步驟2-5,直到達到指定的迭代次數或損失函數的收斂條件。
(2)實現步驟如下:(a)準備數據:將數據集劃分為訓練集和測試集,并進行特征工程,如缺失值填充、特征選擇、特征縮放等。(b)初始化模型參數:設置樹的最大深度、學習率、正則化參數等。(c)訓練模型:使用訓練集數據訓練XGBoost分類器,通過迭代優化模型參數,使損失函數最小化。(d)預測結果:使用訓練好的模型對測試集數據進行預測,得到分類結果。(e)評估模型:根據預測結果和真實標簽,計算模型的準確率、精確率、召回率等指標,評估模型的性能。(f)調參優化:根據模型評估結果,調整模型參數,如增加樹的數量、調整學習率、正則化參數等,以提高模型的性能。
通過不斷迭代優化模型參數,XGBoost能夠有效地處理高維稀疏數據,并在許多機器學習任務中取得優秀的性能。
4.2 歌曲流行度預測
選用隨機森林回歸器和梯度提升回歸器對歌曲流行度進行預測,使用sklearn中的Grid Search方法進行最佳超參數組合的搜索。同時根據預測值和真實值之間的平均絕對誤差MAE來選擇出最佳模型。得到最佳梯度提升模型后,再根據此模型獲取個特征在此模型中的貢獻,并繪圖直觀展示,觀察各特征對歌曲流行度的影響程度。
5. 研究結果及分析
5.1 歌曲流派分類
5.1.1 決策樹分類器
用決策樹分類器對該數據集進行分類,得到結果如圖16。
圖 16決策樹分類器結果
從結果來看,使用該方法得到的結果并不好,準確度約為0.47。可能是在特征工程中未考慮到loudness與energy,acousticness與energy之間有一定的相關性。
5.1.2 隨機森林分類器
對該歌曲數據集用隨機森林方法進行分類,先創建一個Random Forest分類器的實例,再通過設置n_estimators參數為300來指定使用300個決策樹進行集成學習,并設置random_state參數為42以確保結果的可重復性。然后使用fit方法將分類器與訓練數據進行擬合,使用predict方法對測試數據進行預測,將預測結果保存在y_pred_rf變量中,最后使用metrics.accuracy_score方法計算分類器的準確率。運行結果如圖17。
圖 17隨機森林分類器結果
該方法的準確效率約為0.87,相較于之前的決策樹分類器的分類準確率明顯提高。
5.1.3 xgboost分類器
先定義xgboost模型的超參數,網格搜索(grid?search)調優?XGBoost?模型的超參數,進行訓練獲得最佳超參數和最佳模型,然后進行預測,并計算出其準確率,得到結果如圖18。
圖 18 xgboost分類器結果
從結果來看,該分類器最大深度為6,樹為200,,準確率已經約為0.92,其分類效果是這三種分類方法中,最好的。
5.2 歌曲流行度預測
用該數據集進行流行度預測,得到的結果如圖19,在該模型中各特征的貢獻情況如圖19。
圖 19 流行度預測結果
圖 20 預測模型中各特征貢獻率
該預測模型的最低平均絕對誤差約為16,效果還是比較好。在該預測模型中,音軌時間、速度和音量是歌曲流行度預測中貢獻率前三,表明這三個特征變量是流行度預測中最重要的影響因素。
完整的數據集和源代碼:
https://download.csdn.net/download/qq_62974479/90439692