ヤフーニュースのタイトルからPythonでカテゴリ予測[機械学習編]

ついにこのヤフーニュースのカテゴリ予測も5回目で最終回となりました。

ほんとに長かったー。

まだ前のやつを見ていない方はそっちから読んでください。

https://magarikado0.com/yahoo-news-scrape/

ということで今回は前回作った特徴ベクトルからランダムフォレストで分類器を作っていきまあす。

ランダムフォレストで分類します

前回とは違うファイルにソースコードを書いていってください。

とりあえずコード

from sklearn.model_selection import train_test_split#トレーニングデータとテストデータを分けるやつ
import numpy as np#ndarray
from sklearn.metrics import accuracy_score#正解率出すやつ
from sklearn.ensemble import RandomForestClassifier#ランダムフォレスト
f = open("vector.txt","r")#前回作った特徴ベクトルのリストをファイルからとってきます
data= []
for x in f:
    data.append(x.rstrip("\n"))
data=np.array(data,dtype="f2")#配列の要素の型をfloatにする
data=np.reshape(data,(468,95))#468*95の形にする
target=[]#正解ラベル用のリスト
for i in range(234):#経済のカテゴリの正解ラベルを0.0にする
    target.append(0.0)
for i in range(234):#スポーツのカテゴリの正解ラベルを1.0にする
    target.append(1.0)
X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=1)#トレーニングデータとテストデータを分けるます
model=RandomForestClassifier(n_estimators=100, random_state=0)
model=model.fit(X_train, y_train)
pred=model.predict(X_test)
print(accuracy_score(y_test,pred))

上から順番に行きます。

f = open("vector.txt","r")#前回作った特徴ベクトルのリストをファイルからとってきます
data= []
for x in f:
    data.append(x.rstrip("\n"))
data=np.array(data,dtype="f2")#配列の要素の型をfloatにする
data=np.reshape(data,(468,95))#468*95の形にする

リストにいろいろする

まずここではいつものように、前回vector.txtに保存したリストをdataリストに追加していっています。

型変換

ですが一回ファイルに保存してしまったものを取ってくるとリストの型がstringになってしまうので

data=np.array(data,dtype="f2")

で型をfloatにしています。

dtypeのところに型を指定しています。

i1符号あり8ビット整数型
i2符号あり8ビット整数型
i4符号あり8ビット整数型
i8符号あり8ビット整数型
f2半精度浮動小数点型
f4単精度浮動小数点型
f8倍精度浮動小数点型
f16四倍精度浮動小数点型

こんなかんじですね。他にもありますがここではこれだけ紹介しときます。

今回はf2の半精度浮動小数点型をつかいます。

f8とかにしたら精度上がるかなと思ってやってみましたが特に変わらなかったのでf2にしています。

形を変える

で、次ですがこれは配列を468*95の形にしています。

前のファイルで(タイトルの数)*(特徴量)で私の場合は468*95の二次元のリストを作っていたのですが一回ファイルに保存したことによって1行のデータになってしまったのでここで戻しています。

使い方は

代入する配列=np.reshape(変形したい配列,(数字,数字)) 

です。

もちろん私の場合468*95になっているだけでそれぞれ各自の形にしてください。

つぎいきましょう。

ランダムフォレストに入れる

X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.2,random_state=1)#トレーニングデータとテストデータを分けるます
model=RandomForestClassifier(n_estimators=100, random_state=0)
model=model.fit(X_train, y_train)
pred=model.predict(X_test)
print(accuracy_score(y_test,pred))

これでやっと最後ですね。

sklearnのtrain_test_splitで入力データと正解ラベルをトレーニングデータとテストデータに分けます。

test_size=0.2

でトレーニングデータ8割とテストデータ2割に分けてます。

ここも好きなように変えてください。

そしてmodel.fitで学習してmodel.predictで予測させてaccuracy_scoreで正解率を出しています。

model.fitのところのハイパーパラメータももちろん好きなように変えてください。

私の場合正解率は83%くらいでした。

もうちょっと上げれるようにデータ分析もっと勉強したいなと思います。

おわり

この記事含めて5記事にわたってヤフーニュースのタイトルからカテゴリ予測をやってきました。

長かったです。

 

ありがとうございました