目次
概要概要
特定の可能性を推定するために使用される分類モデルは、次のシナリオでよく使用されます。
広告のクリック率:クリックされたかどうか
スパム:スパムかどうか
病気ですか
金融詐欺:それが金融詐欺であるかどうか
偽のアカウント:偽のアカウントかどうか
上記のシナリオの共通点:どちらも2つの分類問題であり、肯定的な例と否定的な例があります。
ロジスティック回帰の原理は、線形回帰の出力をシグモイド関数の入力として使用することによって構築された関数です。
シグモイド関数
ロジスティック関数および活性化関数とも呼ばれ、次の式で表されます。
その機能を図に示します。
この関数は、値の範囲が[0,1]のS字型の曲線です。
ロジスティック回帰は、線形回帰の出力をシグモイド関数の入力として使用することです。
線形回帰の出力を上記の式のxの位置に代入し、それを次のように変換します。
ここで、xはサンプルセットであり、必要なソリューションの重みです。この関数の出力は[0,1]の確率値であり、デフォルトのしきい値は0.5であり、このしきい値を使用してどのカテゴリを決定できます。デフォルトのラベル1は肯定的な例であり、他のカテゴリにはラベルが付けられます。 0、これは反例です。
損失関数
線形回帰では、線形回帰のオフセットと重みは、損失関数の最小値を解くことによって取得されます。つまり、予測値と真の値の2乗の合計の最小値が解かれますが、ロジスティック回帰の場合は、損失関数も解かれます。の最小値はシグモイド関数の重みとバイアスを取得しますが、この時点では予測値はすでに1と0であり、真の値と比較できないため、対数尤度損失が導入されます。ここに:
その中で、yiは真の値と予測値です。
yi = 1の場合、これは現時点での肯定的な例であり、損失関数を次の図に示します。
yが1に近い場合、損失関数の値は0に近いことがわかります。
yi = 0の場合、これは現時点での反例であり、損失関数を次の図に示します。
yが0の位置に近づくと、損失関数の値が0に近づくこともわかります。
最適化の損失
機械学習入門研究(12)-線形回帰と同様に、勾配降下最適化アルゴリズムを使用して、損失関数の値を減らし、元のカテゴリ1の確率を上げ、元のカテゴリ0の確率を減らします。
対応するsklearnAPI
LogisticRegression(self, penalty='l2', dual=False, tol=1e-4, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver='warn', max_iter=100,
multi_class='warn', verbose=0, warm_start=False, n_jobs=None,
l1_ratio=None):
パラメータの意味は次のとおりです。
パラメータ | 意味 |
ペナルティ | 正則化選択パラメーター、オプション値はl1、l2であり、デフォルトはl2です。通常、l2で十分です。L2の正則化が過剰適合であることが判明した場合、つまり予測効果が非常に低い場合は、l1を検討してください。さらに、モデルに多くの特徴があり、いくつかの重要でない特徴係数が0であり、モデルがスパースであることを期待する場合は、l1も使用できます。 ソルバーと組み合わせて使用されます。 |
デュアル | デフォルトはFalseです。これは、正則化されたl2ソルバーがliblinearの場合にのみ適用できます。 通常、サンプルの数は機能の数よりも多く、デフォルトはFalseです。 |
通行料 | 反復終了判定のエラー範囲。デフォルトは1e-4です。 |
C | 正則化係数の逆数。デフォルトは1です。 |
fit_intercept | 切片があるかどうかにかかわらず、デフォルトはtrueです |
切片_スケーリング | ソルバーがliblinearで、fit_interceptがtrueの場合にのみ有効です |
class_weight | 分類におけるさまざまなタイプの重み。これは、class_weight = {0:0.8,1:0.2}として定義できます。つまり、カテゴリ0のサンプルサイズは80%であり、カテゴリ1のサンプルサイズは20%です。 主な機能は次のとおりです。 最初のタイプの誤分類は、正当なユーザーを分類するかどうかなど、コストがかかります。通常は、正当なユーザーを違法なユーザーと判断し、手動で判断します。このようにして、違法ユーザーの重みを適切に増やすことができます 2つ目は、サンプルの不均衡が大きいことです。たとえば、正当なユーザーデータは10,000人ですが、違法なユーザーは5人しかいません。重みを考慮しないと、正当なユーザーと判断される可能性が高いため、選択できます。不法なユーザーのサンプルを自動的に増やすためのバランス。 さらに、サンプルの高さの不均衡については、class_weightを調整することでサンプルの重みを調整できます。また、fit関数を呼び出すときに関数のパラメーターsample_weightを設定することで、サンプルの重みを調整する別の方法があります。 |
random_state | ランダム状態 |
ソルバー | ペナルティと組み合わせて使用されます。 ペナルティがl2の場合、値は次のようになります。 「newton-cg」:損失関数の2次微分行列、つまりヘッセ行列を使用して損失関数を繰り返し最適化するニュートン法ファミリーの一種。 「lbfgs」:損失関数の2次微分行列、つまりヘッセ行列を使用して損失関数を繰り返し最適化する準ニュートン法の一種。 サグ:確率的平均勾配降下法 上述三者适用于较大数据集,支持one-vs-rest(OvS)和many-vs-many(MvM)两种多元逻辑回归。 如果是样本量非常大,比如>10万,sag是第一选择,但不能使用l1正则化。 前三者要求损失函数的一阶或者二阶连续导数 liblinear:开源的liblinear库,内部使用了坐标轴下降法来优化损失函数。适用于小数据集,只支持多元回归的OvR,不支持MvM
如果为l1,则只能取liblinear |
max_iter | 最大迭代次数 |
multi_class | 分类方式的选择 ovr:即one-vs-rest mulitmomial:即many-vs-many。 如果是二元逻辑回归,两者没有差别。主要差别在多元逻辑回归。 ovr:把多元逻辑回归看成二元逻辑回归。对于第K类的分类决策,把第K类的样本作为正例,其他除第K类的所有样本作为负例,得到第K类的分类模型。其他分类依次类推 MvM:如果模型有T类,每次在所有的T类样本里面选择出两类样本,记为T1和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。共进行T(T-1)/2次分类 |
verbose | 日志冗长度。 0:不输出训练过程;1偶尔输出 |
warm_start | 是否热启动。默认False True:则下次训练是以追加树的形式进行,重新使用上一次的调用作为初始化 |
n_jobs | 并行数。默认为1 -1:跟CPU核数一致 |
l1_ratio |
实例
癌症分类预测-是良性还是恶性
数据集特征
有699样本,共11列数据,第一列是检索id,其他的都是跟肿瘤有关的医学特征,最后一列就是肿瘤类型,其中里面有16个缺失值,已经用?标出。
数据集的地址为:
https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data
其中里面对应的字段说明为:
https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.names
次のように、juptyerを介してデータ構造を確認できます。
最終的な分類結果では、2は良性を意味し、4は悪性を意味します。
次のようにコードを見てみましょう。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LogisticRegression
import pandas as pd
import numpy as np
def regression():
# 1)获取数据集
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_names = ["Sample code number", "Clump Thickness ", "Uniformity of Cell Size ", "Uniformity of Cell Shape"
, "Marginal Adhesion", "Single Epithelial Cell Size", "Bare Nuclei", "Bland Chromatin", "Normal Nucleoli",
"Mitoses", "Class"]
data = pd.read_csv(path, names=column_names)
# 2)对数据进行缺失值处理,并将?替换成NAN
data = data.replace(to_replace="?",value=np.nan)
data.dropna(inplace=True)
# 3)划分数据集
#除去最后一列是目标值,其他的列都是特征值
x = data.iloc[:,1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4)进行标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5)预估器
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 6)进行预测
y_predict = estimator.predict(x_test)
#print("预测值:", y_predict)
print("真实值:", y_test==y_predict)
print("逻辑回归模型的参数为 w :", estimator.coef_)
print("逻辑回归模型的参数为 b:", estimator.intercept_)
# 7)模型评估
error = mean_squared_error(y_test, y_predict)
print("逻辑回归 的误差值:", error)
return
次のように出力結果を確認します。
逻辑回归模型的参数为 w : [[1.166673 0.1206053 0.72963858 0.60897593 0.10861572 1.47922335
0.7462081 0.79426579 0.87710322]]
逻辑回归模型的参数为 b: [-0.97797973]
逻辑回归 的误差值: 0.0935672514619883
いくつかの固有値を出力するいくつかの固有値があることがわかります。そのため、エラー値はすでに非常に小さいです。
総括する
2019年の終わりに、機械学習関連のコンテンツを学び始めました。とても楽しかったです。プロジェクトの入札が途中で忙しかったため、しばらく見る時間がなかったので、数回前にこれを書きました。休日。その日の資料をまとめた後、春祭りが帰ってくるのを待った後、頑張って勉強しなければなりません。
いい加減にして!!!