綜合練習——尋找有潛力的bilibili百大UP主(1)

Oto_G發表於2021-08-27

尋找有潛力的bilibili百大UP主(1)

防噴說明:以下僅為個人學習之餘的娛樂專案,本人不主動賦予以下內容任何價值,不確保內容的準確性

歡迎各位友善的指出錯誤

需求描述

預測B站UP主是否有潛力成為百大UP主或知名UP主

需求是自擬的,隨口提的一個想法

需求分析

關鍵字:預測、分類

這個需求的還是比較容易理解的,我們需要構建一個判別體系,這個判別體系能夠通過已知的資料將其分到已知的類別中。

我們需要做的是

  • 確定判別體系
  • 獲取所需資料
  • 資料清洗、統計
  • 確定訓練模型及方法
  • 訓練模型
  • 評價模型

判別體系

由於B站並沒有公佈百大UP主選取的標準(就算有也當它沒有好吧),於是我們需要自己選取樣本值

第一次選取

括號內為特徵權重,權重總和100%

粉絲群體相似度(16%) 平均視訊標題字數(8%) 平均視訊時長(12%) 平均投稿時間段(12%) 平均彈幕佔播放量比值(9%) 平均投幣佔播放量比值(12%) 平均點贊佔播放量比值(9%) 平均收藏佔播放量比值(10%) 平均評論佔播放量比值(12%)

這個判別體系是我認為能夠比較客觀比較UP主間類別的判別體系。

  • 粉絲群體相似度:準備獲取每位UP主的粉絲列表,然後用Tanimoto分值計算相似度
  • 平均視訊標題字數:標題長短可能有些影響,給的權重不是很多
  • 平均視訊時長:視訊時長相似的更有可能是同一類UP
  • 平均投稿時間段:選擇時間點投稿一直是門玄學
  • 平均彈幕佔播放量比值:彈幕是視訊的增香劑,好的視訊彈幕量一定不少,但刷彈幕相對容易所以權重降低
  • 平均投幣佔播放量比值:投幣是對優質視訊的肯定,同時刷投幣比較難,所以權重高
  • 平均點贊佔播放量比值:點贊相對來說是比較容易的,刷點贊也多,所以權重低
  • 平均收藏佔播放量比值:收藏對我個人而言還是比較難接受的,就算他是優質資源也很反感收藏(可能這也是為什麼呢麼多下次一定的原因),所以權重相對降低
  • 平均評論佔播放量比值:也反映了視訊質量,同時出於面子不會機刷評論,所以權重高

但由於B站對於檢視他人粉絲有數量限制,無法獲取UP主的完整粉絲名單,所以粉絲群體相似度這一特徵無法實現

第二次選取

平均視訊標題字數(10%) 平均視訊時長(15%) 平均投稿時間段(15%) 平均彈幕佔播放量比值(10%) 平均投幣佔播放量比值(14%) 平均點贊佔播放量比值(10%) 平均收藏佔播放量比值(12%) 平均評論佔播放量比值(14%)

獲取所需資料

確定完判別體系,我們接下來確定需要哪些資料

  • 樣本基本資訊,及UP主的ID、暱稱、頭銜
  • 通過ID獲取每個UP的所有粉絲
  • 通過ID獲取每個UP的所有視訊的標題、時長、釋出時間、播放量、彈幕數、投幣、點贊、收藏、評論

本人關注列表

  • 請求URL

    • https://api.bilibili.com/x/relation/followings?
      
  • 請求頭引數

    • referer: https://space.bilibili.com/{vmid}/fans/follow
      cookie: {cookie}
      
  • 攜帶引數

    • vmid: {vmid}
      pn: 2
      ps: 20
      order: desc
      order_type: attention
      

UP基本資訊

  • 請求URL

    • https://api.bilibili.com/x/space/acc/info?
      
  • 攜帶引數

    • mid: {mid}
      

UP視訊資訊

標題、時長、釋出時間、播放量

  • 請求URL

    • https://api.bilibili.com/x/space/arc/search?
      
  • 請求頭引數

    • referer: https://space.bilibili.com/{vmid}/fans/follow
      
  • 攜帶引數

    • mid: {mid}
      ps: 1
      tid: 0
      pn: 1
      order: pubdate
      jsonp: jsonp
      

彈幕、投幣、點贊、收藏、評論

  • 請求URL

    • https://api.bilibili.com/x/web-interface/archive/stat?
      
  • 請求頭引數

    • referer: https://space.bilibili.com/{vmid}/fans/follow
      
  • 攜帶引數

    • aid: {aid}
      

資料清洗、統計

獲取到的視訊資料中有已被刪除的視訊資料,這些資料的播放量為‘--’,不應計入總視訊量,同時由於需要求平均操作,播放量為零的視訊需要做特殊處理。

視訊標題需要統計字數

視訊時長獲得的格式為‘HH:MM’,需要統一成秒數

視訊釋出時間為時間戳格式,需要統一成小時

需要對每位UP打上標籤

確定訓練資料及特徵

接下來的操作都在MATLAB中完成

匯入資料

clear,clc
[data,name] = xlsread('bilibiliUP','Sheet1','B2:J149');
save data name data

分析資料

樣本總數為148個,特徵項8項

特徵分佈

b1

b2

特徵均值、中位數、標準差

平均視訊標題字數(個) 平均視訊時長(s) 平均投稿時間段(h) 平均彈幕佔播放量比值(%) 平均投幣佔播放量比值(%) 平均點贊佔播放量比值(%) 平均收藏佔播放量比值(%) 平均評論佔播放量比值(%)
均值 25.5496 739.2298 15.0893 0.64 2.37 6.33 1.63 0.56
中位數 27.0743 414.5715 15.2024 0.54 2.14 6.06 1.36 0.41
標準差 7.0943 1.5957e+03 2.2214 4.7169e-03 1.4920e-02 2.9482e-02 1.2083e-02 5.7272e-03

相關係數矩陣

由於想做下聚類分析,所以先對特徵間相關性進行分析

相關係數矩陣
1 0.0184325288466795 -0.0249488481946810 0.000556029951779419 -0.0781882042420524 -0.168742474288945 0.0918842200982381 0.211218436765012
0.0184325288466795 1 -0.0684400833088982 0.135256877104381 -0.0839986211337289 -0.231039187955712 0.161255474364964 -0.0238979157736475
-0.0249488481946810 -0.0684400833088982 1 0.0642875823784235 0.182932469005339 0.216237989286477 -0.0167989352674504 -0.124649717355339
0.000556029951779419 0.135256877104381 0.0642875823784235 1 0.418871812486625 -0.0442827567357434 -0.0158181841190108 0.0996439284969066
-0.0781882042420524 -0.0839986211337289 0.182932469005339 0.418871812486625 1 0.468509412567601 0.438604301439134 0.241896824716753
-0.168742474288945 -0.231039187955712 0.216237989286477 -0.0442827567357434 0.468509412567601 1 0.183186223938856 0.0503927120668548
0.0918842200982381 0.161255474364964 -0.0167989352674504 -0.0158181841190108 0.438604301439134 0.183186223938856 1 0.357856402521907
0.211218436765012 -0.0238979157736475 -0.124649717355339 0.0996439284969066 0.241896824716753 0.0503927120668548 0.357856402521907 1

最大相關係數為0.47,屬於一般相關,這裡個人仍選擇進行主成分分析

主成分分析

貢獻率(%) 載荷矩陣
25.1275 -0.0154356012464888 0.439271317949718 -0.239468930154721 0.640874181590308 0.299234983162774 -0.489223750723536 0.0908810289215616 0.0399568700489856
18.6910 -0.0633151967720804 0.392258362039291 0.504163254738602 -0.411223722446849 0.444807070009181 -0.0650455225958284 0.440099753219734 0.151878186756074
14.8629 0.178975010961490 -0.393567647425860 0.168327298137570 0.380362735131868 0.659830736056726 0.448429308073384 -0.0501509982524432 -0.0328937010028770
12.4349 0.269286890707300 0.113144944244625 0.678576159768060 0.337839313324345 -0.359229553698078 -0.0556086435211860 -0.0116149200092179 -0.455860379941969
11.5216 0.625773896426006 -0.0714169658824892 0.155677911835697 0.0140278224639614 -0.112535587324820 -0.184136256454763 -0.169887284588042 0.709536571769867
7.6773 0.431907250553736 -0.415984327691833 -0.237474739608985 -0.140210810209029 0.0404217529290391 -0.345760241577645 0.589026077373038 -0.310200032544974
6.4894 0.449395895969865 0.325883099539835 -0.181948722076682 -0.358695083065022 0.299349431999138 -0.0494929449168077 -0.521984313795124 -0.406876856255649
3.1955 0.333334561923556 0.448479293459293 -0.293153813734111 0.113340671631467 -0.210414742505219 0.629557129219618 0.383564575615655 0.0350827640124736

分析得:前六項累計貢獻率達90.3%,故選擇前六項進行分析

對新資料再次進行相關係數分析

相關係數矩陣
1 0.182007545883040 -0.0713354084624925 -0.151681329692816 0.0614584785271987 -0.125737466947417
0.182007545883040 1 0.324008369791875 0.0885939787345643 0.0591884996936010 -0.133187717940026
-0.0713354084624925 0.324008369791875 1 -0.0852536338605460 -0.00112597217476600 0.00576904941809119
-0.151681329692816 0.0885939787345643 -0.0852536338605460 1 -0.174500701145123 -0.256700669541367
0.0614584785271987 0.0591884996936010 -0.00112597217476600 -0.174500701145123 1 0.110149618536761
-0.125737466947417 -0.133187717940026 0.00576904941809119 -0.256700669541367 0.110149618536761 1

各特徵間相關係數低,符合預期

聚類分析

聚類
clear
clc
load data

Y = pdist(clearData, 'mahalanobis');
Z = linkage(Y,'average');
C = cophenet(Z,Y) %計算cophenet相關係數,取最大即可
figure
T = cluster(Z,6);
dendrogram(Z, 0, 'Orientation','left','ColorThreshold','default','Labels', name) %生成譜系圖
title('{\bf 譜系圖}')

% LDA降維
[YY, WW, lambda] = LDA(clearData, T);

% Tsne
mappedX = tsne(clearData, [], 3, 6, 30);

%繪圖
figure
scatter3(YY(:,1), YY(:,2), YY(:,3), 30, colorSet(T), 'filled')
title('{\bf 聚類散點圖(LDA降維)}')

figure
scatter3(mappedX(:,1), mappedX(:,2), mappedX(:,3), 30, colorSet(T), 'filled')
title('{\bf 聚類散點圖(Tsne)}')

b3

完整譜系圖見 bilibiliUP譜系圖下載——密碼:6634_

b4

b5

判別
clear
clc
load data

%生成訓練測試集
indices = crossvalind('Kfold', size(clearData,1), 30);

tests = (indices == 1);
train = ~tests;
trainData = clearData(train, :);
trainName = name(train,:);
testData = clearData(tests,:);
testName = name(tests,:);

%聚類
% trainData = zscore(trainData);%對抽取樣本重新標準化
Y = pdist(trainData, 'euclidean');
Z = linkage(Y,'ward');
T = cluster(Z,6);%分六類

%判別
[class,err] = classify(testData,trainData,T,'diagLinear');
testName,class

%SVM
svmModel = fitcecoc(trainData, T);
classification = predict(svmModel, testData);
classification

% LDA降維
trainAndTest = [T,trainData];
trainAndTest = [trainAndTest;[class,testData];[classification,testData]];
trainLen = size(trainData, 1);
testLen = size(testData, 1);
[YY, WW, lambda] = LDA(trainAndTest(:,2:end), trainAndTest(:,1));

% 繪圖
figure
scatter(YY(1:trainLen,1), YY(1:trainLen,2), 30, colorSet(trainAndTest(1:trainLen,1)), 'filled')
hold on
s2 = scatter(YY(trainLen+1:trainLen+testLen,1), YY(trainLen+1:trainLen+testLen,2), 50, colorSet(trainAndTest(trainLen+1:trainLen+testLen,1)), '^');
hold on
s3 = scatter(YY(trainLen+testLen+1:end,1), YY(trainLen+testLen+1:end,2), 50, colorSet(trainAndTest(trainLen+testLen+1:end,1)), 'v');
legend([s2,s3],'對角線性距離預測','SVM預測')
title('{\bf 基於聚類的判別(LDA降維)}')
text(YY(trainLen+testLen+1:end,1),YY(trainLen+testLen+1:end,2),testName(:,1))
hold off

b6

使用聚類對資料進行了探索,並嘗試進行判別,但並沒有能夠理解聚類後的UP主間的關係,哈哈。下一步準備進入主題,利用已知標籤進行模型訓練。

訓練模型

有監督模型訓練

因為接下來的訓練都已知標籤,所以預設的特徵權重在訓練中沒有意義,故選擇未加權的標準化資料。

clear,clc
load data

ct1 = 0;
ct2 = 0;

rR1 = zeros(2,2);%混淆矩陣
rR2 = zeros(2,2);

times = 4;
clearData = zscore(data);
indices = crossvalind('Kfold', size(clearData,1), times);
i = 1;
for i = 1 : times
    tests = (indices == i);
    train = ~tests;
    trainData = clearData(train, :);
    trainName = name(train,:);
    trainScore = score(train,:);
    testData = clearData(tests,:);
    testName = name(tests,:);
    testScore = score(tests,:);

    T = trainScore;

    %判別
    [class,err] = classify(testData,trainData,T,'diagLinear');

    %SVM
    t = templateSVM('Standardize',true,'BoxConstraint',2);
    svmModel = fitcecoc(trainData, T, 'Learners',t);
    classification = predict(svmModel, testData);
    
    % 計算
    [m1,rR1] = mre(testScore, class, rR1);
    ct1 = ct1 + m1;
    [m2,rR2] = mre(testScore, classification, rR2);
    ct2 = ct2 + m2;
end
'對角線性距離判別MRE、混淆矩陣、準確率、召回率:'
ct1/times
rR1
right1 = rR1./sum(rR1,1);
recall1 = rR1./sum(rR1,2);
right1(1),recall1(1)
'支援向量機MRE、混淆矩陣、準確率、召回率:'
ct2/times
rR2
right2 = rR2./sum(rR2,1);
recall2 = rR2./sum(rR2,2);
right2(1),recall2(1)

通過對角線性和支援向量機的比較,以及在不同標籤下的表現,現有如下結論(評判標準為MRE、混淆矩陣、精確率、召回率):

  • 在標籤為2類即【百大/非百大】時,進行五十層交叉驗證

    • 對角線性模型
      • MRE:0.4707
      • 混淆矩陣 [103,30;3,12]
      • 精確率 [0.9717;0.2857](非百大;百大)
      • 召回率 [0.7744;0.8000]
    • SVM
      • MRE:0.3372
      • 混淆矩陣 [130,3;14,1]
      • 精確率 [0.9028;0.2500](非百大;百大)
      • 召回率 [0.9774;0.0667]
  • 在標籤為3類即【百大/知名/普通】時,進行五十層交叉驗證

    • 對角線性模型
      • MRE:0.8091
      • 混淆矩陣 [60,17,10;16,17,13;2,5,8]
      • 精確率 [0.7692;0.4359;0.2581](普通;知名;百大)
      • 召回率 [0.6897;0.3696;0.5333]
    • SVM
      • MRE:0.6508
      • 混淆矩陣 [75,11,1;26,19,1;6,5,4]
      • 精確率 [0.7009;0.5429;0.6667](普通;知名;百大)
      • 召回率 [0.8621;0.4130;0.2667]
  • 在標籤為4類即【百大+知名/百大/知名/普通】時,進行五十層交叉驗證

    • 對角線性模型
      • MRE:1.1934
      • 混淆矩陣 [56,11,13,7;10,13,11,12;0,2,3,1;0,3,1,5]
      • 精確率 [0.8485;0.4483;0.1071;0.2000](普通;知名;百大;百大+知名)
      • 召回率 [0.6437;0.2826;0.5000;0.5556]
    • SVM
      • MRE:0.7737
      • 混淆矩陣 [75,9,2,1;25,18,2,1;1,4,1,0;1,4,2,2]
      • 精確率 [0.7353;0.5143;0.1429;0.5000](普通;知名;百大;百大+知名)
      • 召回率 [0.8621;0.3913;0.1667;0.2222]

模型效果分析

經過分析,在現有樣本集下,在2類預測時,對角線性預測在預測非百大時精確度高達到97%,在預測百大時召回率較高達到80%,說明當此模型預測為非百大時,有97%可能性預測正確,此模型預測為百大的所有UP中,有80%的UP能夠成為百大。

同時分析發現,在現有樣本集下,多類預測時,兩種方式的精確率或召回率都較低,分析混淆矩陣後認為原因是樣本集中標籤佔比不均衡導致,現有樣本集下有樣本148份,其中百大+知名9份、百大6份、知名46份,佔比較低,導致訓練模型欠擬合。

模型展示圖

b7

改進計劃

經過分析,目前主要問題為資料集內不同標籤資料量佔比嚴重失衡,解決方向有兩個:增加資料量佔比較少的標籤的資料量或者是減少佔比過大的標籤的資料量。介於目前標籤數為4,樣本數148,選擇增加資料量是相對容易的方式。

由於B站有反爬措施,而百大UP主視訊資料相對較多,平均每人資料需要0.5天爬取,預計增加百大UP主數量到150位,總樣本數量到達300個左右,最快需要一個月時間能夠爬取完畢,改進完成後會將文章連結更新在本文。

相關文章