Fake News!
トランプ氏が大統領に就任して以降、様々なニュースに対しこのように言及し批判することが多いですよね。
Twitterでも活動的で中にはアグレッシブな投稿も。
このようにメディアに対しFakeと攻撃的な言動を取っている一方、当の本人のツイートの信憑性がどれくらいあるかもまた疑問であることも事実。
そこで今回は機械学習の技術を用いてトランプ氏のツイートがTrueかFakeかを検証していきます。
今回行うこと
Kaggleというサイトにアクセスし、Fake and real news dataset Classifying the newsというページからニュースのデータセットを使ってトランプ氏が就任して以降のニュースの真偽を判定するモデルを作成します。
次に、Trump Tweets Tweets from @realdonaldtrumpにあるデータから大統領就任以降のツイートを抽出、TrueとFakeがどれくらいの比率で判定されたかを図にします。
【重要】記事の内容につき注意事項
今回「トランプ氏のツイート」という切り口から機械学習に取り組みましたが
政治的な意図など全くなく機械学習のアウトプットで今回トランプ氏のツイートを切り口にしているだけであり、これからお伝えする検証結果もFakeでブーメランとなる可能性が十分にあるということをご承知の上お読みいだだけますようお願い致します。
TrueかFakeはあくまで計算上の結果なので本当はどうなのかを保証するものでは全くないですし、特定の立場の方を指示したり批判したりするために記事を書いたわけではありませんのでご注意いただきますようお願い致します。
Step1:ニュースのデータをモデル作成用に前処理
最初のステップとしてFake and real news dataset Classifying the newsにあるデータセットを前処理にモデル作成できる形に整えていきます。
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import datetime as dt
import warnings
warnings.filterwarnings('ignore')
from sklearn.preprocessing import LabelEncoder
次に該当するページのcavファイルを読み込んでいきます。
fake = pd.read_csv("Fake.csv")
true = pd.read_csv("True.csv")
該当するページでは正しいものとそうでないものをFakeとTrueの2つのファイルに分けられています。
コラムと型を見ていきましょう。
fake.columns
Index(['title', 'text', 'subject', 'date'], dtype='object')
fake.dtypes
title object
text object
subject object
date object
dtype: object
true.columns
Index(['title', 'text', 'subject', 'date'], dtype='object')
true.dtypes
title object
text object
subject object
date object
dtype: object
どちらのファイルにもTrueかFakeかを直接示すものがないことがわかります。
そこを明記した上で1つにまとめます。
fake["Reality"] = 0
true["Reality"] = 1
#新たにRealityを作成。Fakeを0、Trueを1にする。
df = pd.concat([fake, true], axis=0)
df = df.reset_index(drop=True)
df.isnull().sum()
title 0
text 0
subject 0
date 0
Reality 0
dtype: int64
df.head()
#もともとあったどちらのファイルも欠損はありませんでした。分量が多くなりすぎるので省略していますが事前にしっかり確認しておくことが大切です。
|title|text|subject|date|Reality|
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|
|0|Donald Trump Sends Out Embarrassing New Year’...|Donald Trump just couldn t wish all Americans ...|News|December 31, 2017|0
|1|Drunk Bragging Trump Staffer Started Russian ...|House Intelligence Committee Chairman Devin Nu...|News|December 31, 2017|0
|2|Sheriff David Clarke Becomes An Internet Joke...|On Friday, it was revealed that former Milwauk...|News|December 30, 2017|0
|3|Trump Is So Obsessed He Even Has Obama’s Name...|On Christmas day, Donald Trump announced that ...|News|December 29, 2017|0
|4|Pope Francis Just Called Out Donald Trump Dur...|Pope Francis used his annual Christmas Day mes...|News|December 25, 2017|0
df.tail()
title | text | subject | date | Reality | |
---|---|---|---|---|---|
44893 | 'Fully committed' NATO backs new U.S. approach... | BRUSSELS (Reuters) - NATO allies on Tuesday we... | worldnews | August 22, 2017 | 1 |
44894 | LexisNexis withdrew two products from Chinese ... | LONDON (Reuters) - LexisNexis, a provider of l... | worldnews | August 22, 2017 | 1 |
44895 | Minsk cultural hub becomes haven from authorities | MINSK (Reuters) - In the shadow of disused Sov... | worldnews | August 22, 2017 | 1 |
44896 | Vatican upbeat on possibility of Pope Francis ... | MOSCOW (Reuters) - Vatican Secretary of State ... | worldnews | August 22, 2017 | 1 |
44897 | Indonesia to buy $1.14 billion worth of Russia... | JAKARTA (Reuters) - Indonesia will buy 11 Sukh... | worldnews | August 22, 2017 | 1 |
以上から同一ファイル内でTrueとFakeが両方あることを確認できました。
subjectというものがあるので見てみましょう。もしトランプ氏とまず関係ないものがあればそのニュースはカットします。
df["subject"].unique()
array(['News', 'politics', 'Government News', 'left-news', 'US_News',
'Middle-east', 'politicsNews', 'worldnews'], dtype=object)
#トランプ関係はどのジャンルでも関わる可能性が高いのでここでは考えないことにします。
次に日付を分離してみます。
df = pd.concat([df['title'], df['text'], df['subject'],df["date"]\
.str.extract('(?P<Month>.*) (?P<Day>.*), (?P<Year>.*)',expand=True),df["date"],df["Reality"]], axis=1)
df.head()
|title|text|subject|Month|Day|Year|date|Reality|
|:-----------|------------:|:------------:|:------------:|:------------:|:------------:|------------:|------------:|------------:|
|0 |Donald Trump Sends Out Embarrassing New Year’... |Donald Trump just couldn t wish all Americans ... |News |December |31 |2017 |December 31, 2017 |0
|1 |Drunk Bragging Trump Staffer Started Russian ... |House Intelligence Committee Chairman Devin Nu... |News |December |31 |2017 |December 31, 2017 |0
|2 |Sheriff David Clarke Becomes An Internet Joke... |On Friday, it was revealed that former Milwauk... |News |December |30 |2017 |December 30, 2017 |0
|3 |Trump Is So Obsessed He Even Has Obama’s Name... |On Christmas day, Donald Trump announced that ... |News |December |29 |2017 |December 29, 2017 |0
|4 |Pope Francis Just Called Out Donald Trump Dur... |Pope Francis used his annual Christmas Day mes... |News |December |25 |2017 |December 25, 2017 |0
これで日付もうまく分離できたように見えましたが問題が。
df.isnull().sum()
title 0
text 0
subject 0
Month 45
Day 45
Year 45
date 0
Reality 0
dtype: int64
ここでうまくいってない日があるようです。うまくいっている部分と切り分けて確認をしていきます。
nonull = df.dropna()
nonull.isnull().sum()
title 0
text 0
subject 0
Month 0
Day 0
Year 0
date 0
Reality 0
dtype: int64
null = df[df.isnull().any(axis=1)]
#ここでうまくいっていないもののみを確認。
null.head()
title | text | subject | Month | Day | Year | date | Reality | |
---|---|---|---|---|---|---|---|---|
9050 | Democrat Senator Warns Mueller Not To Release ... | According to The Hill, Democrat Senator Bob Ca... | politics | NaN | NaN | NaN | 19-Feb-18 | 0 |
9051 | MSNBC ANCHOR Flabbergasted at What Texas Teach... | If we protect every other government building ... | politics | NaN | NaN | NaN | 19-Feb-18 | 0 |
9052 | WATCH: SNOWFLAKES ASKED Communist Party Platfo... | Ami Horowitz is fantastic! Check out this man ... | politics | NaN | NaN | NaN | 19-Feb-18 | 0 |
9053 | JUST IN: BADASS GENERAL JOHN KELLY Shoved Chin... | Just one more reminder of why President Trump ... | politics | NaN | NaN | NaN | 18-Feb-18 | 0 |
9054 | DOJ’s JEFF SESSIONS Opens Investigation Into W... | Thank goodnesss Jeff Sessions is moving on fin... | politics | NaN | NaN | NaN | 18-Feb-18 | 0 |
null = null.drop(["Month", "Day", "Year"], axis=1)
#ここで改めて年月日を作り直す
null = null.reset_index(drop=True)
null.head()
|title |text |subject |date |Reality
|:-----------|------------:|:------------:|------------:|------------:|------------:|
|0 |Democrat Senator Warns Mueller Not To Release ... |According to The Hill, Democrat Senator Bob Ca... |politics |19-Feb-18 |0
|1 |MSNBC ANCHOR Flabbergasted at What Texas Teach... |If we protect every other government building ... |politics |19-Feb-18 |0
|2 |WATCH: SNOWFLAKES ASKED Communist Party Platfo... |Ami Horowitz is fantastic! Check out this man ... |politics |19-Feb-18 |0
|3 |JUST IN: BADASS GENERAL JOHN KELLY Shoved Chin... |Just one more reminder of why President Trump ... |politics |18-Feb-18 |0
|4 |DOJ’s JEFF SESSIONS Opens Investigation Into W... |Thank goodnesss Jeff Sessions is moving on fin... |politics |18-Feb-18 |0
終わりの部分も見てみましょう。
null.tail()
|title |text |subject |date |Reality
|:-----------|------------:|:------------:|------------:|------------:|------------:|
|40 |https://fedup.wpengine.com/wp-content/uploads/...| https://fedup.wpengine.com/wp-content/uploads/...| Government News| https://fedup.wpengine.com/wp-content/uploads/... |0
|41 |https://fedup.wpengine.com/wp-content/uploads/...| https://fedup.wpengine.com/wp-content/uploads/...| Government News| https://fedup.wpengine.com/wp-content/uploads/... |0
|42 |Homepage |[vc_row][vc_column width= 1/1 ][td_block_trend...| left-news| MSNBC HOST Rudely Assumes Steel Worker Would N... |0
|43 |https://fedup.wpengine.com/wp-content/uploads/...| https://fedup.wpengine.com/wp-content/uploads/...| left-news| https://fedup.wpengine.com/wp-content/uploads/... |0
|44 |https://fedup.wpengine.com/wp-content/uploads/...| https://fedup.wpengine.com/wp-content/uploads/...| left-news| https://fedup.wpengine.com/wp-content/uploads/... |0
日付がURLになっているものまで出てきています。他の情報までURLとなっているのでそういったものは除外しましょう。
日付が〇〇-〇〇-〇〇と表記されているものが多いのでそこから手をつけていきます。
null_dates = null["date"].str.extract('(?P<Day>.*)-(?P<Month>.*)-(?P<Year>.*)',expand=True)
null_dates.dtypes
Day object
Month object
Year object
dtype: object
null_dates
#年月日を分離したがそれでもうまくいってないものを見ます。分量が多くなりすぎてしまうので該当しない部分は「省略」します。
Day | Month | Year | |
---|---|---|---|
省略 | 省略 | 省略 | 省略 |
35 | https://100percentfedup.com/served-roy-moore-v... | commander | soldier/ |
36 | https://100percentfedup.com/video-hillary-aske... | some | pie/ |
37 | https://100percentfedup.com/12-yr-old-black-co... | from | left/ |
38 | NaN | NaN | NaN |
39 | NaN | NaN | NaN |
40 | NaN | NaN | NaN |
41 | NaN | NaN | NaN |
42 | NaN | NaN | NaN |
43 | NaN | NaN | NaN |
44 | NaN | NaN | NaN |
該当箇所が最後の方だったので該当箇所を見ていきます。
null["date"].tail(10)
35 https://100percentfedup.com/served-roy-moore-v...
36 https://100percentfedup.com/video-hillary-aske...
37 https://100percentfedup.com/12-yr-old-black-co...
38 https://fedup.wpengine.com/wp-content/uploads/...
39 https://fedup.wpengine.com/wp-content/uploads/...
40 https://fedup.wpengine.com/wp-content/uploads/...
41 https://fedup.wpengine.com/wp-content/uploads/...
42 MSNBC HOST Rudely Assumes Steel Worker Would N...
43 https://fedup.wpengine.com/wp-content/uploads/...
44 https://fedup.wpengine.com/wp-content/uploads/...
Name: date, dtype: object
最早日付自体が滅茶苦茶になっていることがわかります。
該当箇所を削除します。
null = null[:-10]
null_dates = null_dates[:-10]
日付のおかしな部分は削除したものの日付を同じ形にし就任前のものを削除するという課題が残っています。
続けて取り組んでいきましょう。
#月の表記
df["Month"].unique()
array(['December', 'November', 'October', 'September', 'August', 'July',
'June', 'May', 'April', 'March', 'February', 'January', nan, 'Dec',
'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'Apr', 'Mar', 'Feb',
'Jan'], dtype=object)
null_dates["Month"].unique()
array(['Feb'], dtype=object)
null_dates["Month"] = "February"
#FebのみなのでFebruaryに合わせます。
#年の表記
null_dates["Year"].unique()
array(['18'], dtype=object)
null_dates["Year"] = "2018"
#18のみなので2018に統一
null_filled = pd.concat([null['title'], null['text'], null['subject'],\
null_dates["Month"],null_dates["Day"], null_dates["Year"],null["date"],\
null["Reality"]], axis=1)
#nullとnull_datesを整える
table = pd.concat([nonull, null_filled], axis=0)
table = table.drop("date", axis=1)
#これで日付の形式を統一できた
table = table.reset_index(drop=True)
#ここでインデックスを順序通りにする
#subject
le = LabelEncoder()
encoded = le.fit_transform(table['subject'].values)
decoded = le.inverse_transform(encoded)
table['subject'] = encoded
#直接関係はないがsubjectを数字に変換しておく
#月の統一
table["Month"].unique()
array(['December', 'November', 'October', 'September', 'August', 'July',
'June', 'May', 'April', 'March', 'February', 'January', 'Dec',
'Nov', 'Oct', 'Sep', 'Aug', 'Jul', 'Jun', 'Apr', 'Mar', 'Feb',
'Jan'], dtype=object)
table["Month"] = table["Month"].map({'December':12, 'November':11, 'October':10, 'September':9, 'August':8, 'July':7,
'June':6, 'May':5, 'April':4, 'March':3, 'February':2, 'January':1, 'Dec':12,
'Nov':11, 'Oct':10, 'Sep':9, 'Aug':8, 'Jul':7, 'Jun':6, 'Apr':4, 'Mar':3, 'Feb':2,
'Jan':1})
#型変換
table.dtypes
#Day,Yearがobjectになってるので直す
title object
text object
subject int64
Month int64
Day object
Year object
Reality int
table["Day"] = table["Day"].astype("int64")
table["Year"] = table["Year"].astype("int64")
table.dtypes
title object
text object
subject int64
Month int64
Day int64
Year int64
Reality int64
dtype: object
table.isnull().sum()
title 0
text 0
subject 0
Month 0
Day 0
Year 0
Reality 0
#これで欠損値の問題は解決
ここまで型変換や表記の統一などを続けて行ってきました。
最後にトランプ氏が就任した2017年1月20日以前のニュースはカットします。
そのためdatetimeを用います。
dates = table[["Year", "Month", "Day"]]
dates = pd.to_datetime(dates)
dates.head()
0 2017-12-31
1 2017-12-31
2 2017-12-30
3 2017-12-29
4 2017-12-25
dtype: datetime64[ns]
news = pd.concat([table, dates], axis=1)
news = news.rename(columns={0: 'dates'})
news = news[["text", "dates", "Reality"]]
news[news["dates"] > dt.datetime(2017,1,20)]
#大統領が就任する前はすべてカット
news = news.drop("dates", axis=1)
news.head()
#これで完成。
text | Reality | |
---|---|---|
0 | Donald Trump just couldn t wish all Americans ... | 0 |
1 | House Intelligence Committee Chairman Devin Nu... | 0 |
2 | On Friday, it was revealed that former Milwauk... | 0 |
3 | On Christmas day, Donald Trump announced that ... | 0 |
4 | Pope Francis used his annual Christmas Day mes... | 0 |
これでトランプ氏就任以降のニュースとその真偽をまとめたものが完成しました。
最後にcsvファイルに保存し次のステップに進んでいきましょう。
news.to_csv("news_for_learning.csv", index=False)
Step2:トランプ氏のツイートのデータを判定用に前処理
次にTrump Tweets Tweets from @realdonaldtrumpから大統領就任以降のツイートを抽出していきます。
データを読み込み中身を見てみましょう。
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import datetime as dt
import warnings
warnings.filterwarnings('ignore')
trump = pd.read_csv("trumptweets.csv")
trump.head()
id | link | content | date | retweets | favorites | mentions | hashtags | geo | |
---|---|---|---|---|---|---|---|---|---|
0 | 1698308935 | https://twitter.com/realDonaldTrump/status/169... | Be sure to tune in and watch Donald Trump on L... | 2009-05-04 20:54:25 | 500 | 868 | NaN | NaN | NaN |
1 | 1701461182 | https://twitter.com/realDonaldTrump/status/170... | Donald Trump will be appearing on The View tom... | 2009-05-05 03:00:10 | 33 | 273 | NaN | NaN | NaN |
2 | 1737479987 | https://twitter.com/realDonaldTrump/status/173... | Donald Trump reads Top Ten Financial Tips on L... | 2009-05-08 15:38:08 | 12 | 18 | NaN | NaN | NaN |
3 | 1741160716 | https://twitter.com/realDonaldTrump/status/174... | New Blog Post: Celebrity Apprentice Finale and... | 2009-05-08 22:40:15 | 11 | 24 | NaN | NaN | NaN |
4 | 1773561338 | https://twitter.com/realDonaldTrump/status/177... | "My persona will never be that of a wallflower... | 2009-05-12 16:07:28 | 1399 | 1965 | NaN | NaN | NaN |
trump.dtypes
id int64
link object
content object
date object
retweets int64
favorites int64
mentions object
hashtags object
geo float64
dtype: object
様々な内容がありますがここではdate(日付)とcontent(内容)のみを使うことになります。
日付をdatetimeに直していきます。
trump['Date'] = pd.to_datetime(trump['date'])
trump[trump["Date"] > dt.datetime(2017,1,20)]
これで大統領就任前のツイートはすべて消去しました。
content以外のデータは削除しTruthとPercentageという新しい項目を追加します。
モデルを作成し検証をする際、TruthにTrueかFakeかの結論、Percentageに計算結果の可能性を格納します。
trump = trump[["content"]]
trump["Truth"] = "Unknown"
#これで内容はcontentとTruthのみに。真偽判定の結果はTrueとFakeの文字型で。
trump["Percentage"] = 0
#パーセンテージも追加しておく
trump = trump.reset_index(drop=True)
#ここでインデックスを順序通りにする
trump.head()
content | Truth | Percentage | |
---|---|---|---|
0 | Be sure to tune in and watch Donald Trump on L... | Unknown | 0 |
1 | Donald Trump will be appearing on The View tom... | Unknown | 0 |
2 | Donald Trump reads Top Ten Financial Tips on L... | Unknown | 0 |
3 | New Blog Post: Celebrity Apprentice Finale and... | Unknown | 0 |
4 | "My persona will never be that of a wallflower... | Unknown | 0 |
これで必要な情報だけに絞り込めたので新たなcsvファイルに保存します。
trump.to_csv("trump_for_judging.csv", index=False)
次のステップでモデル作成に取り組んでいきます。
Step3:ニュースのデータを基にモデル作成
必要なcsvファイルは一通り揃ったので今度はニュースの判定をするモデルを作っていきます。
ここでは単純ベイズ分類器を利用します。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from nltk.classify import NaiveBayesClassifier
from nltk.classify.util import accuracy as nltk_accuracy
import pickle
news = pd.read_csv("news_for_learning.csv")
#Step1で作成したcsvファイル
今回はTrueとFakeそれぞれでリストを作成しそれぞれに該当する単語を辞書形式で格納していきます。
Fake =[]
Fact = []
for text, reality in zip(news['text'], news['Reality']):
line = text.split(" ")
dic = {}
if reality == 0:
for word in line:
dic[word] = True
ireru = (dic, 0)
Fake.append(ireru)
else:
for word in line:
dic[word] = True
ireru = (dic, 1)
Fact.append(ireru)
これでそれぞれのリストに単語を格納できました。
例えばFake[0]と出力させるだけでも膨大な量の単語が出てくるのでここでは省略します。
それでは訓練データとテストデータを作成しへと繋げていきます。ここではデータの9割を訓練に利用します。
threshold = 0.9
num_fake = int(threshold * len(Fake))
num_fact = int(threshold * len(Fact))
features_train = Fake[:num_fake] + Fact[:num_fact]
features_test = Fake[num_fake:] + Fact[num_fact:]
classifier = NaiveBayesClassifier.train(features_train)
print('Accuracy of the classifier:', nltk_accuracy(classifier, features_test))
Accuracy of the classifier: 0.9585746102449889
精度を見ると95%以上でかなり高いことがわかります。どういった単語がカギを握るのか見ていきましょう。
N = 15
print('Top ' + str(N) + ' most informative words:')
for i, item in enumerate(classifier.most_informative_features()[:N]):
print(str(i+1) + '. ' + item[0])
Top 15 most informative words:
1. (Reuters)
2. -
3. -
4. screenshot
5. Image:
6. MOSCOW
7. BERLIN
8. screengrab
9. Images
10. Editing
11. WASHINGTON
12. Kurdistan
13. corrects
14. racists
15. Image
このように見ると記号や地名、中にはracistといったものが重要となることがわかります。
最後にモデルを保存しましょう。
filename = 'model_for_trump.sav'
pickle.dump(classifier, open(filename, 'wb'))
これで保存完了です。
Step2でこれまで記述してきたコードに続き以下のコードを実行しニュースをコピペすると真贋判定が出ます。
冒頭でも言及したようにあくまで計算上の結果であり本当にそうなのかという保証はできないのであくまで自己責任でお願いします。
def extract_features(words):
return dict([(word, True) for word in words])
print(dict([(word, True) for word in words]))
#先程のリストと同じ形式で辞書を格納させる
#文章をその場で入力したものを見る
input_review = input()
print("Fact Check:")
#extract_features(input_review)
print("\nNews Text:",input_review)
features = extract_features(input_review.split())
print(features)
probabilities = classifier.prob_classify(features)
predicted_truth = probabilities.max()
if predicted_truth == 0:
answer = "Fake News!!!"
else:
answer = "True News!!!"
print("Predicted Answer:", answer)
print("Probability:", round(probabilities.prob(predicted_truth), 2))
Step4:モデルを用いてツイートの真偽を検証
最後のステップではいよいよトランプ氏のツイートの検証をしていきます。
ファイルやライブラリの読み込みから始めていきましょう。
import pandas as pd
import pickle
trump = pd.read_csv("trump_for_judging.csv")
#トランプのツイートをロードする
classifier = pickle.load(open('model_for_trump.sav', 'rb'))
# 保存したモデルをロードする
import matplotlib.pyplot as plt
import seaborn as sns
#最後に真偽の比率を確認する
次に真贋判定をする関数を作成します。これは前のステップの最後のコードに少し手を加えたものです。
def FactCheck(event):
global answer
global percentage
line = event.split(" ")
dic = {}
for word in line:
dic[word] = True
probabilities = classifier.prob_classify(dic)
predicted_truth = probabilities.max()
percentage = round(probabilities.prob(predicted_truth))
if predicted_truth == 0:
answer = "Fake"
else:
answer = "True"
return answer
ここでは各ニュースに対する判定結果をTrueとFakeの二択とし、どれくらいの可能性でその判定が出ているかの数値も出力できるようにしています。
これから判定作業を行いそれぞれの結果を先程読み込んだcsvファイルに書き込んでいきます。
for i, v in trump.iterrows():
FactCheck(v["content"])
trump.at[trump.index[i], 'Truth'] = answer
trump.at[trump.index[i], 'Percentage'] = percentage
trump.head()
content | Truth | Percentage | |
---|---|---|---|
0 | Be sure to tune in and watch Donald Trump on L... | Fake | 1 |
1 | Donald Trump will be appearing on The View tom... | Fake | 1 |
2 | Donald Trump reads Top Ten Financial Tips on L... | Fake | 1 |
3 | New Blog Post: Celebrity Apprentice Finale and... | Fake | 1 |
4 | "My persona will never be that of a wallflower... | True | 1 |
これでツイートに対し判定結果と数値を出すことができました。 |
それでは真贋の比率をグラフにしてみましょう。
f,ax=plt.subplots(1,2,figsize=(18,8))
trump['Truth'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.1f%%',ax=ax[0],shadow=True)
ax[0].set_title('Truth')
ax[0].set_ylabel('')
sns.countplot('Truth',data=trump,ax=ax[1])
ax[1].set_title('Truth')
plt.show()
trump.describe()
Percentage | |
---|---|
count | 41122.0 |
mean | 1.0 |
std | 0.0 |
min | 1.0 |
25% | 1.0 |
50% | 1.0 |
75% | 1.0 |
max | 1.0 |
Trueが13.6%。ツイートのうち約7回に6回がFakeという結果でした。
また、全ツイートのパーセンテージが1、つまり100%正しいという計算結果が出ていたようでした。
終わりに
今回Kaggleにあるニュースの真贋を明記したファイルを用いてモデルを作成しトランプ氏のツイートの真贋判定を行いました。
その結果同氏のツイートの約7回に6回がフェイクの可能性が高いという結果が出ました。
パーセンテージのところですべて1と出てしまうのはどうしてなのかが疑問点なので検証していくつもりです。
初めでも述べましたがこれはあくまで計算上の結果なのでこの検証結果が事実と合致するという保証はできません。
また、特定の政治的立場に立ち誰かを擁護したり批判する意図はないので改めてご理解いただけると幸いです。
長い記事になりましたが最後まで読んでくださりありがとうございました。