ロジスティック回帰に基づくニュースデータセットの分類

1.作者について

Sheng Siyu、男性、西安工科大学電子情報学部、2021年の大学院生
研究の方向性:監視されていないネットワークに基づく産業用画像欠陥検出の研究
Eメール:[email protected]

Wu Yanzi 、女性、西安工科大学電子情報学部、2021年大学院生、Zhang Hongwei人工知能研究グループ
研究の方向性:パターン認識と人工知能
Eメール:[email protected]

2.ロジスティック回帰

2.1ロジスティック回帰

回帰モデルでは、従属変数はすべて数値間隔変数であり、確立されたモデルは、従属変数の期待値と独立変数の間の線形関係を記述します。たとえば、一般的な線形回帰モデル:
ここに画像の説明を挿入
実際の問題を分析するための回帰モデルの使用では、調査される変数は、多くの場合、すべての間隔変数ではなく、順序変数または二項分布問題などの属性変数です。年齢、性別、体重指数、平均血圧、疾患指数、およびその他の指標を分析して、人が糖尿病に変化したかどうかを判断することにより、Y = 0は疾患がないことを意味し、Y = 1は疾患を意味し、ここでの応答変数は2点です。 (0-1)分布変数、h関数の連続値で従属変数Yを予測することはできません(0または1のみを取ることができます)。
つまり、線形回帰モデルは通常、従属変数が連続変数であるという問題を扱います。従属変数が定性変数である場合、線形回帰モデルは適用できなくなり、ロジスティック回帰モデルを使用して解決する必要があります。それ。
ロジスティック回帰(ロジスティック回帰)は、従属変数がカテゴリ変数である回帰問題を処理するために使用されます。一般的な問題は2項分布または二項分布であり、複数カテゴリの問題も処理できます。これは実際には分類方法です。
ここに画像の説明を挿入
2クラス問題の確率と独立変数の関係は、上の図に示すように、シグモイド関数によって実装されるS字型の曲線であることがよくあります。
ここでは、関数を次のように定義します。関数
ここに画像の説明を挿入
の定義域はすべて実数であり、値の範囲は[0、1]であり、0点のx軸に対応する結果は0.5です。xの値が十分に大きい場合は、0または1タイプの問題と見なすことができます。0.5より大きい場合は、タイプ1の問題と見なすことができます。それ以外の場合は、タイプ0の問題と見なすことができます。はわずか0.5で、タイプ0またはタイプ1に分けることができます。0-1タイプの変数の場合、y=1の確率分布式は次のように定義されます
ここに画像の説明を挿入。y=0の確率分布式は次のように定義されます。
ここに画像の説明を挿入
離散確率変数の期待値式は次
ここに画像の説明を挿入
のとおりです。線形モデルが使用されます。分析のために、式の変換は次のとおりです
ここに画像の説明を挿入。実際のアプリケーションでは、確率pと従属変数は非線形であることがよくあります。この種の問題を解決するために、ロジット変換を導入します。 logit§と独立変数。ロジスティック回帰モデルは次のように定義されます。
ここに画像の説明を挿入
導出により、確率pは次のように変換されます。これは、シグモイド関数と一致し、確率pと従属変数の間の非線形関係も反映しています。0.5を限界として、予測pが0.5より大きい場合、この時点でyは1である可能性が高いと判断します。それ以外の場合、yは0です。
ここに画像の説明を挿入
必要なシグモイド関数を取得した後、前の線形回帰のように、式にn個のパラメーターθを適合させるだけで済みます。
ロジスティック回帰の従属変数は、バイナリまたはマルチクラスにすることができますが、バイナリがより一般的に使用され、解釈が容易です。したがって、実際に最も一般的に使用されるのは、二項分類のロジスティック回帰です。マルチクラス分類問題の場合、2クラス分類問題と見なすことができます。一方を保持し、残りをもう一方として保持します。

2.2ロジスティック回帰アルゴリズム

LogisticRegression回帰モデルはSklearn.linear_modelサブクラスの下にあり、sklearnロジスティック回帰アルゴリズムを呼び出す手順は比較的簡単です。つまり
、モデルをインポートします。ロジスティック回帰LogisticRegression()関数を呼び出します。
fit()トレーニング:fit(x、y)メソッドを呼び出してモデルをトレーニングします。ここで、xはデータの属性、yはタイプです。
予測()予測:トレーニング済みモデルを使用してデータセットを予測し、予測結果を返します。

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)

1.正則化選択パラメーター:ペナルティ
LogisticRegressionおよびLogisticRegressionCVには、デフォルトで正則化項があります。ペナルティパラメータのオプションの値は「l1」と「l2」です。これらはそれぞれL1正則化とL2正則化に対応します。デフォルトはL2正則化です。
パラメータを調整するとき、私たちの主な目的が過剰適合を解決することである場合、通常、ペナルティとしてL2正則化を選択するだけで十分です。ただし、L2正則化が選択されていて、それでも過剰適合であることがわかった場合、つまり予測効果が低い場合は、L1正則化を考慮することができます。さらに、モデルに多くの特徴があり、重要でない特徴係数をゼロにしてモデル係数をスパースにしたい場合は、L1正則化も使用できます。

2.最適化アルゴリズム選択パラメーター:ソルバー
ソルバーパラメーターは、ロジスティック回帰損失関数の最適化方法を決定します。選択できるアルゴリズムは4つあります
。liblinear:オープンソースのliblinearライブラリ実装を使用し、座標軸降下法が内部で使用されます。損失関数を繰り返し最適化します。
lbfgs:損失関数の2次導関数行列、つまりヘッセ行列を使用して損失関数を繰り返し最適化する、一種の準ニュートン法。
newton-cg:これもニュートン法ファミリーの一種であり、損失関数の2次導関数行列、つまりヘッセ行列を使用して、損失関数を繰り返し最適化します。
最急降下法:最急降下法の変形である確率的平均勾配降下法通常の最急降下法との違いは、各反復でサンプルの一部のみを使用して勾配を計算することです。これは、サンプルが多い場合に適しています。データ。SAGは線形収束アルゴリズムであり、SGDよりもはるかに高速です。SAGの理解については、ブログ投稿SAG、線形収束確率的最適化アルゴリズムのSVRG(確率的勾配降下法)を参照してください。
要約すると、liblinearはL1とL2をサポートし、複数分類のOvRのみをサポートします。 newton-cg "" L2のみをサポートし、複数分類のためにOvRとMvMをサポートします。

3.分類方法の選択パラメーター:multi_class
multi_classパラメーターは、分類方法の選択を決定します。選択できる値はovrとmultinomialの2つです。デフォルトはovrです。
ovrは前述のone-vs-rest(OvR)であり、多項分布は前述のmany-vs-many(MvM)です。バイナリロジスティック回帰の場合、ovrと多項の間に違いはなく、違いは主に多重ロジスティック回帰にあります。
OvRの考え方は非常に単純で、メタロジスティック回帰がいくつあっても、バイナリロジスティック回帰と考えることができます。具体的な方法は、Kthクラスの分類決定のために、Kthクラスのすべてのサンプルを正の例として、Kthクラスのサンプルを除くすべてのサンプルを負の例として取り、それに対してバイナリロジスティック回帰を実行して取得することです。 Kthクラス分類モデル。他のクラスの分類モデルが取得されます。

MvMは比較的複雑です。ここでは、説明のためにMvM one-vs-one(OvO)の特殊なケースを示します。モデルにTクラスがある場合、毎回すべてのTクラスサンプルから2種類のサンプルを選択します。これらはT1クラスとT2クラスとして記録され、出力がT1とT2であるすべてのサンプルをまとめて、T1を正とします。たとえば、T2は否定的な例として使用され、モデルパラメータを取得するためにバイナリロジスティック回帰が実行されます。合計でT(T-1)/2の分類が必要です。
上記の説明から、OvRは比較的単純ですが、分類効果は比較的劣っています(これはほとんどのサンプル分布を参照しており、一部のサンプル分布ではOvRの方が優れている場合があります)。MvM分類は比較的正確ですが、分類速度はOvRほど速くありません。

ovrを選択すると、損失関数liblinear、newton-cg、lbfgs、sagの4つの最適化方法を選択できます。ただし、多項分布を選択した場合は、newton-cg、lbfgs、およびsagのみを選択できます。

4.タイプ重みパラメーター:class_weight
class_weightパラメーターは、分類モデル内のさまざまなタイプの重みを示すために使用されます。省略、つまり、重みが考慮されないか、すべてのタイプの重みが同じです。入力する場合は、バランスを選択してクラスライブラリに型の重みを計算させるか、各型の重みを自分で入力することができます。たとえば、バイナリモデルが0,1の場合、class_weightを定義できます。 = {0:0.9、1:0.1}、このように、タイプ0の重みは90%で、タイプ1の重みは10%です。
class_weightがバランスを選択した場合、クラスライブラリはトレーニングサンプルサイズに従って重みを計算します。特定のタイプのサンプルサイズが大きいほど、重みは小さくなり、サンプルサイズが小さいほど、重みは大きくなります。

5.サンプルの重みパラメーター:sample_weight
は、サンプルの不均衡の問題の下でサンプル自体の不均衡が原因で、サンプル全体の偏りのない推定値ではありません。これにより、モデルの予測能力が低下する可能性があります。この場合、サンプルの重みを調整することで、この問題の解決を試みることができます。サンプルの重みを調整する方法は2つあります。1つは、class_weightでbalancedを使用する方法です。2つ目は、fit関数を呼び出すときに、sample_weightによって各サンプルの重みを調整することです。

3.実験手順

3.1 fetch_20newsgroups(ニューステキストの20のカテゴリ)データセットの概要

20newsgroupsデータセットには、合計20のトピックを含む18,000を超えるニュース記事が含まれているため、20newsgroupsテキストデータセットと呼ばれます。これは、通常テキスト分類に使用されるトレーニングセットとテストセットの2つの部分に分かれています。さまざまなトピックの20のニュースに均等に分割されます。グループコレクション。20newsgroupsデータセットは、テキスト分類、テキストマイニング、および情報検索の研究に使用される国際標準データセットの1つです。一部のニュースグループには非常に類似したトピックがあり(例:comp.sys.ibm.pc.hardware / comp.sys.mac.hardware)、他のニュースグループは完全に無関係です(例:misc.forsale /soc.religion.christian)。

3.2実験コード

プロセス全体は、データ収集、特徴抽出、モデルトレーニング、モデル評価の4つの部分に分かれています。
1.データ収集

from sklearn.datasets import fetch_20newsgroups
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)

data_homeはデータセットのアドレスを参照します。デフォルトでは、すべてのデータは「〜/scikit_learn_data」フォルダーにあります。
サブセットは、トレーニング、テスト、および3つのオプションすべてであり、それぞれトレーニングセット、テストセット、およびすべてのサンプルに対応します。
カテゴリ:カテゴリを参照します。カテゴリが指定されている場合は、ターゲットカテゴリのみが抽出されます。デフォルトの場合は、すべてのカテゴリが抽出されます。
シャッフル:サンプルが互いに独立している場合に、サンプルの順序をシャッフルするかどうか。
random_state:順序をシャッフルするためのランダムシード
remove:タイトル参照など、いくつかのストップワードを削除するために使用されるタプルです。
download_if_missing:データが欠落している場合にダウンロードするかどうか。
テスト後、
twenty_train.dataはリスト型であり、各要素は記事であるstr型です。
20_train.targetはそのラベルです。
2.特徴抽出

'''
这是开始提取特征,这里的特征是词频统计。
'''
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
'''
这是开始提取特征,这里的特征是TFIDF特征。
'''
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

3.モデルトレーニング

'''
使用逻辑回归分类,并做出简单的预测
'''
from sklearn.linear_model import LogisticRegression  # 逻辑回归
clf = LogisticRegression().fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf = tfidf_transformer.transform(X_new_counts)
predicted = clf.predict(X_new_tfidf)
for doc, category in zip(docs_new, predicted):
    print('%r => %s' % (doc, twenty_train.target_names[category]))

ロジスティック回帰アルゴリズムを使用して、2つのカテゴリの文の予測テストをトレーニングおよび実行して、結果を取得します
ここに画像の説明を挿入
。4.モデルの評価モデル
の評価は、通常、PRF(精度、再現率、F1値)およびAcc値(精度値)を使用して評価されます。 )、したがって、metrics.classification_reportメソッドを使用してこの情報を簡単に取得でき、このメソッドを使用して2つのターゲットの違いを比較できます。

from sklearn import metrics
import numpy as np
twenty_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)
docs_test = twenty_test.data
X_test_counts = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
predicted = clf.predict(X_test_tfidf)
print(metrics.classification_report(twenty_test.target, predicted,target_names=twenty_test.target_names))
print("accurary\t"+str(np.mean(predicted == twenty_test.target)))

3.3実行結果

ここに画像の説明を挿入

参照する

1. [Python] 20Newsgroupテキスト分類(TF-IDFベクトル化、10個のsklearn分類子)
2。データセット:fetch_20newsgroups(20種類のニューステキスト)データセットの紹介、インストール、使用方法の詳細ガイド
3.ロジスティック回帰(ロジスティック回帰)回帰)

おすすめ

転載: blog.csdn.net/m0_37758063/article/details/123642943