import pandas as pd
movies = pd.read_csv('movies.csv', index_col=0).reset_index(drop=True)print(f'Number of reviews: {movies.shape[0]:,}\n')print(movies.head())提供:
Number of reviews:7,501
review label
0 This short spoof can be found on Elite's Mille...01 A singularly unfunny musical comedy that artif...02 An excellent series, masterfully acted anddir...13 The master of movie spectacle Cecil B. De Mill...14 I was gifted with this movie as it had such a ...0提供:
from sklearn.feature_extraction.text import CountVectorizer
# Creating new features
vect = CountVectorizer(max_features=200)
vect.fit(movies.review)
X_review = vect.transform(movies.review)
X_df = pd.DataFrame(X_review.toarray(), columns=vect.get_feature_names())# Combining the new features with the label
movies_bow = pd.concat([movies['label'], X_df], axis=1)print(movies_bow.head())提供:
label 10 about acting action actors actually after again all... \
00000000000...10101010003...21000000100...31000100000...40100100003...
will with without work world would years you young your
0010001000012710020302202000000103000000011040201000000[5 rows x 201 columns]提供:
lr = LogisticRegression()
lr.fit(X_train, y_train)# Predicting the probability of the 0 class
predictions_prob_0 = lr.predict_proba(X_test)[:,0]# Predicting the probability of the 1 class
predictions_prob_1 = lr.predict_proba(X_test)[:,1]print(f'First 10 predicted probabilities of class 0: {predictions_prob_0[:10].round(3)}\n'f'First 10 predicted probabilities of class 1: {predictions_prob_1[:10].round(3)}')提供:
First 10 predicted probabilities of class0:[0.2460.1430.1230.7080.0010.8280.2040.5310.1210.515]
First 10 predicted probabilities of class1:[0.7540.8570.8770.2920.9990.1720.7960.4690.8790.485]提供:
データサイエンスのユースケースは、データが大量に蓄積されている、あるいは蓄積し得るほぼすべての業界に関連します。 実店舗やECサイトは、マーケティング施策に惹きつけられた人々が実際に顧客体験をする場であり、特定のブランドや企業の貴重な購買データが収集される場所です。ここで人々は、特定の商品を本当に購入したいかどうか、当初予定していなかった別のものに興味を持ったか、どのくらいの価格なら支払う用意があるか、再訪するかどうか、そしてその顧客体験についてどのようなレビューを残すか、といった最終判断を下します。
実際、顧客レビューは、販売プロセス全体で何を変えるべきか、あるいは強化すべきかを分析・把握するための強力なデータ源です。このようにデータを分析することで、コスト削減、業務効率の向上、顧客体験の改善、新たな機会の発見、事業の成長、そして最終的には収益の増加が見込めます。ここでは、この貴重な情報をデータサイエンスのアルゴリズムでどのように分析・モデリングし、隠れた洞察を得て、個々の顧客からの全体的なメッセージを把握できるかを詳しく見ていきます。
セールスにおけるデータサイエンスのユースケース:顧客感情の分析
顧客感情分析は、特定企業のサービスや製品を利用する際の顧客の感情を自動的に特定するプロセスです。通常、オンライン調査、ソーシャルメディア、サポートチケット、フィードバックフォーム、商品レビュー、フォーラム、電話、メール、チャットボットなどから収集される非構造化のテキストデータを扱います。機械学習では、自然言語処理(NLP)を通じて、統計的・言語学的手法を適用し、テキストデータから直接、肯定・否定・中立の感情を抽出します。基本的には、次の2つのパラメータを出力します。
顧客感情分析は、実行可能な示唆を得て、顧客を不満にさせる重大な反復的課題を特定・修正し、ポジティブな感情を生む製品・サービスの機能を強化し、全体としてより効率的なデータドリブンの意思決定を行うのに役立つため、あらゆる現代ビジネスにとって重要なツールです。より細かなレベルでは、顧客感情分析によって次のことが可能になります。
他のテキスト分析タスクと同様に、顧客感情分析の実施にあたってはいくつかの落とし穴があります。たとえば、NLPアルゴリズムは一部のレビューに含まれる皮肉を捉えられず、誤分類することがあります。また、ごく特定の略語や稀なスラングをうまく解読できない場合もあります。
データセットの準備
ここでは、IMDBの映画レビューのデータセットを使って、顧客感情分析が実際にどのように機能するかを見ていきます。
列は2つあります。各レビュー本文と、全体的な感情の評価(ポジティブ=1、ネガティブ=0)です。
ポジティブ・ネガティブ各レビューの割合を計算します。
したがって、ポジティブとネガティブの比率はほぼ同じです。
BOW手法の適用
次のステップは、テキストデータを数値に変換することです。機械学習モデルは数値特徴量しか扱えないためです。具体的には、各単語が各レビューで何回出現したかを数える特徴量を作成します。最も基本的かつ直接的なアプローチがBag-of-Words(BOW)で、文書に出現するすべての単語の語彙を構築し、各レビューにおける各単語の出現頻度を数えます。その結果、単語ごとに1つの新しい特徴量が得られ、対応する頻度が格納されます。
データセットにBOW手法を適用してみましょう。
上では、max_featuresというオプション引数を適用し、最も頻出する200語のみに絞ることで、潜在的な過学習を避けています。
教師あり機械学習モデルによる感情の予測
ここからは、教師あり機械学習モデルを使って感情を予測します。ラベル付きの既存レビューに基づいて、新しいレビューの感情がポジティブかネガティブかを推定したいので、分類問題を扱うことになります。ここでもロジスティック回帰アルゴリズムを用い、モデルの精度を測定します。
このモデルでは、実際はポジティブだったレビューの11%をネガティブと誤分類し、実際はネガティブだったレビューの13%をポジティブと誤分類しました。精度向上のための方策としては、ストップワード(例:「about」「will」「you」など、情報量が少なく頻出する語)の除外や、語彙サイズの拡大が考えられます。
BOW手法を適用すると、データフレームに数百から数千の新しい特徴量が生まれる可能性があります。これは、不要な特徴量やパラメータが多すぎる過度に複雑な(過学習した)モデルを招くことがあります。これを抑える一つの方法が正則化で、モデルの関数を制約します。ここで調整するパラメータがCで、正則化の強さを表します。Cの値として100と0.1の2つを試し、テストデータでどちらがより良い性能を示すかを確認してみましょう。
選択したCの値による精度の差はごくわずかでした。さらに多くの値で試行すれば、性能をより向上させるパラメータが見つかる可能性はあります。しかし、ここでは新しい特徴量は200個に限られており、モデルはそれほど複雑ではないため、正則化は必須ではありません。
predict関数で0または1のラベルを予測する代わりに、predict_probaで感情の確率を予測することもできます。この場合、確率に対してはそのまま精度や混同行列を適用できません。これらの指標はクラスに対してのみ機能するためです。したがって、確率をクラスに変換する必要があります。既定では、確率が0.5以上ならクラス1、未満ならクラス0に変換されます。
まとめ
よりきめ細かな感情分析を行うために、このデータセットに適用できる有用なアプローチは他にも多数あります。
これらの手法や、洞察に富む感情分析のためのその他の有用なテクニックに関心があれば、コース「Sentiment Analysis in Python」をご覧ください。