Technologieaustausch

Maschinelles Lernen (5) – Überwachtes Lernen (6) – Logistische Regression

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Inhaltsverzeichnis und Links zu Artikelserien

Vorheriger Artikel:Maschinelles Lernen (5) – Überwachtes Lernen (5) – Lineare Regression 2
Nächster Artikel:Maschinelles Lernen (5) – Überwachtes Lernen (7) – SVM1


Vorwort

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


1. Populäres Verständnis und Definition

1. Was ist logistische Regression (Was)

Logistische Regression = lineare Regression + Sigmoidfunktion

Die logistische Regression besteht einfach darin, eine gerade Linie zum Teilen binärer Daten zu finden.

2. Der Zweck der logistischen Regression (Warum)

Lösen Sie das binäre Klassifizierungsproblem, indem Sie die Objekte klassifizieren, die zu einer bestimmten Kategorie gehörenWahrscheinlichkeitswertUm festzustellen, ob es zu einer bestimmten Kategorie gehört, wird diese Kategorie standardmäßig mit 1 (positives Beispiel) und die andere Kategorie mit 0 (negatives Beispiel) markiert.

3. So finden Sie diese Zeile (How)

Tatsächlich ähnelt dies dem linearen Regressionsschritt. Der Unterschied liegt in den Methoden zur „Überprüfung des Modellanpassungseffekts“ und „Anpassen des Modellpositionswinkels“.

  1. Zeichnen Sie zufällig eine gerade Linie als erste gerade Linie
  2. Überprüfen Sie die passende Wirkung.
  3. Wenn es nicht das Beste ist (Schwellenwert erreicht), passen Sie die Linienposition und den Winkel an
  4. Wiederholen Sie die Schritte 2 und 3, bis der beste Effekt (den eingestellten Schwellenwert erreicht) und schließlich das gewünschte Modell erreicht ist.

Sie müssen eine Funktion (Sigmoidfunktion) verwenden, um die Eingabedaten auf einen Wert zwischen 0 und 1 abzubilden. Wenn der Funktionswert größer als 0,5 ist, wird er als 1 beurteilt, andernfalls ist er 0. Dies kann in eine probabilistische Darstellung umgewandelt werden.

2. Prinzipielles Verständnis und Formeln

1. Perzeptron

1.1. Problembeschreibung

Nehmen Sie als Beispiel die Bildklassifizierung und teilen Sie Bilder in vertikal und horizontal auf

So werden diese Daten im Diagramm angezeigt. Um die Punkte unterschiedlicher Farbe (verschiedener Kategorien) im Diagramm zu trennen, zeichnen wir eine solche Linie. Der Zweck dieser Klassifizierung besteht darin, eine solche Linie zu finden.

Dies ist eine „gerade Linie, die den Gewichtsvektor zu einem Normalenvektor macht“ (der Gewichtsvektor sei senkrecht zur Linie).

w ist der Gewichtsvektor; es handelt sich also um eine gerade Linie des Normalenvektors

1.2. Perceptron-Modell

Ein Modell, das mehrere Werte akzeptiert, jeden Wert mit seiner jeweiligen Gewichtung multipliziert und schließlich die Summe ausgibt.

1.3. Diskriminanzfunktion

Das innere Produkt ist ein Maß für den Grad der Ähnlichkeit zwischen Vektoren. Ein positives Ergebnis zeigt Ähnlichkeit an, ein Wert von 0 zeigt Vertikalität an und ein negatives Ergebnis zeigt Unähnlichkeit an.

verwendenEs ist besser zu verstehen, weil |w| und |x| beide positive Zahlen sind, also ist das Vorzeichen des inneren Produkts cosθ, das heißt, wenn es kleiner als 90 Grad ist, ist es ähnlich, und wenn es größer ist 90 Grad, das ist unähnlich

1.4. Parameterschätzung (Gewichtsaktualisierungsausdruck)

Wenn er dem ursprünglichen Etikettenwert entspricht, wird der Gewichtsvektor nicht aktualisiert. Wenn er nicht dem ursprünglichen Etikettenwert entspricht, wird der Gewichtsvektor durch Vektoraddition aktualisiert.

Wie in der Abbildung gezeigt, wenn es nicht mit dem Originaletikett übereinstimmt, dann

gerade Linie nach dem Update

Nach dem Update gleich

Schritte: Bestimmen Sie zunächst zufällig eine gerade Linie (dh bestimmen Sie zufällig einen Gewichtsvektor w), setzen Sie die reellen Wertdaten x in das innere Produkt ein und erhalten Sie über die Diskriminanzfunktion einen Wert (1 oder -1), wenn dieser gleich ist Zum ursprünglichen Etikettenwert wird der Gewichtsvektor nicht aktualisiert. Wenn er vom ursprünglichen Etikettenwert abweicht, verwenden Sie die Vektoraddition, um den Gewichtsvektor zu aktualisieren.

! ! !Hinweis: Das Perzeptron kann nur linear trennbare Probleme lösen
Linear trennbar: Fälle, in denen gerade Linien zur Klassifizierung verwendet werden können
Lineare Untrennbarkeit: kann nicht durch gerade Linien klassifiziert werden

2. Sigmoidfunktion

Schwarz ist die Sigmoidfunktion, Rot ist die Stufenfunktion (diskontinuierlich)

Funktion: Die Eingabe der logistischen Regression ist das Ergebnis der linearen Regression.Wir können einen vorhergesagten Wert in der linearen Regression erhalten. Die Sigmoid-Funktion ordnet jede Eingabe dem Intervall [0,1] zu und vervollständigt so die Konvertierung vom Wert in die Wahrscheinlichkeit, was eine Klassifizierungsaufgabe ist.

3. Logistische Regression

3.1. Modelldefinition

Logistische Regression = lineare Regression + Sigmoidfunktion

Lineare Regression:

Sigmoidfunktion:

Logistische Regression:

Damit y die Bezeichnung darstellt, ändern Sie sie in:

Um Wahrscheinlichkeiten zu ermitteln, verwenden Sie:

3.2. Diskriminanzfunktion

Das heißt, Kategorien können anhand der Wahrscheinlichkeit unterschieden werden

3.3. Entscheidungsgrenze

Es kann wie folgt umgeschrieben werden:

Wann

Ersatzdaten:

Es gibt so ein Bild

Die zur Datenklassifizierung verwendete Gerade ist die Entscheidungsgrenze

3.4. Zielfunktion (Log-Likelihood-Funktion)

Was wir wollen, ist Folgendes:
Wenn y=1 ist, ist P(y=1|x) am größten
Wenn y=0 ist, ist P(y=0|x) am größten

Likelihood-Funktion (gemeinsame Wahrscheinlichkeit): Hier ist die Wahrscheinlichkeit, die wir maximieren möchten

Log-Likelihood-Funktion: Es ist schwierig, die Likelihood-Funktion direkt zu differenzieren und muss zuerst logarithmiert werden

Nach der Verformung ergibt sich:

3.4. Parameterschätzung (Gradientenabstieg)

Ableitung der Likelihood-Funktion:

3. Vor- und Nachteile

3.1. Vorteile:

1. Einfach zu implementieren: Die logistische Regression ist ein einfacher Algorithmus, der leicht zu verstehen und zu implementieren ist.
2. Hohe Recheneffizienz: Die logistische Regression erfordert einen relativ geringen Rechenaufwand und eignet sich für große Datensätze.
3. Starke Interpretierbarkeit: Die Ausgabeergebnisse der logistischen Regression sind Wahrscheinlichkeitswerte, die die Ausgabe des Modells intuitiv erklären können.

3.2. Nachteile:

1. Anforderungen an die lineare Trennbarkeit: Die logistische Regression ist ein lineares Modell und schneidet bei nichtlinearen trennbaren Problemen schlecht ab.
2. Merkmalskorrelationsproblem: Die logistische Regression reagiert empfindlicher auf die Korrelation zwischen Eingabemerkmalen. Wenn eine starke Korrelation zwischen Merkmalen besteht, kann dies zu einer Verschlechterung der Leistung des Modells führen.
3. Überanpassungsproblem: Wenn zu viele Stichprobenmerkmale vorhanden sind oder die Anzahl der Stichproben gering ist, ist die logistische Regression anfällig für Überanpassungsprobleme.

3. **Algorithmusimplementierung

1. Daten abrufen

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. %matplotlib notebook
  5. # 读取数据
  6. train=pd.read_csv('csv/images2.csv')
  7. train_x=train.iloc[:,0:2]
  8. train_y=train.iloc[:,2]
  9. # print(train_x)
  10. # print(train_y)
  11. # 绘图
  12. plt.figure()
  13. plt.plot(train_x[train_y ==1].iloc[:,0],train_x[train_y ==1].iloc[:,1],'o')
  14. plt.plot(train_x[train_y == 0].iloc[:,0],train_x[train_y == 0].iloc[:,1],'x')
  15. plt.axis('scaled')
  16. # plt.axis([0,500,0,500])
  17. plt.show()

2. Datenverarbeitung

  1. # 初始化参数
  2. theta=np.random.randn(3)
  3. # 标准化
  4. mu = train_x.mean(axis=0)
  5. sigma = train_x.std(axis=0)
  6. # print(mu,sigma)
  7. def standardize(x):
  8. return (x - mu) / sigma
  9. train_z = standardize(train_x)
  10. # print(train_z)
  11. # 增加 x0
  12. def to_matrix(x):
  13. x0 = np.ones([x.shape[0], 1])
  14. return np.hstack([x0, x])
  15. X = to_matrix(train_z)
  16. # 绘图
  17. plt.figure()
  18. plt.plot(train_z[train_y ==1].iloc[:,0],train_z[train_y ==1].iloc[:,1],'o')
  19. plt.plot(train_z[train_y == 0].iloc[:,0],train_z[train_y == 0].iloc[:,1],'x')
  20. plt.axis('scaled')
  21. # plt.axis([0,500,0,500])
  22. plt.show()

3.Sigmoidfunktion und Diskriminanzfunktion

  1. # sigmoid 函数
  2. def f(x):
  3. return 1 / (1 + np.exp(-np.dot(x, theta)))
  4. # 分类函数
  5. def classify(x):
  6. return (f(x) >= 0.5).astype(np.int)

4. Parametereinstellung und Schulung

  1. # 学习率
  2. ETA = 1e-3
  3. # 重复次数
  4. epoch = 5000
  5. # 更新次数
  6. count = 0
  7. print(f(X))
  8. # 重复学习
  9. for _ in range(epoch):
  10. theta = theta - ETA * np.dot(f(X) - train_y, X)
  11. # 日志输出
  12. count += 1
  13. print('第 {} 次 : theta = {}'.format(count, theta))

5. Zeichnungsbestätigung

  1. # 绘图确认
  2. plt.figure()
  3. x0 = np.linspace(-2, 2, 100)
  4. plt.plot(train_z[train_y ==1].iloc[:,0],train_z[train_y ==1].iloc[:,1],'o')
  5. plt.plot(train_z[train_y == 0].iloc[:,0],train_z[train_y == 0].iloc[:,1],'x')
  6. plt.plot(x0, -(theta[0] + theta[1] * x0) / theta[2], linestyle='dashed')
  7. plt.show()

 

6.Verifizierung

  1. # 验证
  2. text=[[200,100],[500,400],[150,170]]
  3. tt=pd.DataFrame(text,columns=['x1','x2'])
  4. # text=pd.DataFrame({'x1':[200,400,150],'x2':[100,50,170]})
  5. x=to_matrix(standardize(tt))
  6. print(x)
  7. a=f(x)
  8. print(a)
  9. b=classify(x)
  10. print(b)
  11. plt.plot(x[:,1],x[:,2],'ro')

 

4. Schnittstellenimplementierung

1. Einführung in den Brustkrebs-Datensatz

1.1、API

from sklearn.datasets import load_breast_cancer

1.2. Grundlegende Informationen

  1. # 键
  2. print("乳腺癌数据集的键:",breast_cancer.keys())
  3. # 特征值名字、目标值名字
  4. print("乳腺癌数据集的特征数据形状:",breast_cancer.data.shape)
  5. print("乳腺癌数据集的目标数据形状:",breast_cancer.target.shape)
  6. print("乳腺癌数据集的特征值名字:",breast_cancer.feature_names)
  7. print("乳腺癌数据集的目标值名字:",breast_cancer.target_names)
  8. # print("乳腺癌数据集的特征值:",breast_cancer.data)
  9. # print("乳腺癌数据集的目标值:",breast_cancer.target)
  10. # 返回值
  11. # print("乳腺癌数据集的返回值:n", breast_cancer)
  12. # 返回值类型是bunch--是一个字典类型
  13. # 描述
  14. # print("乳腺癌数据集的描述:",breast_cancer.DESCR)
  15. # 每个特征信息
  16. print("最小值:",breast_cancer.data.min(axis=0))
  17. print("最大值:",breast_cancer.data.max(axis=0))
  18. print("平均值:",breast_cancer.data.mean(axis=0))
  19. print("标准差:",breast_cancer.data.std(axis=0))

  1. # 取其中间两列特征
  2. x=breast_cancer.data[0:569,0:2]
  3. y=breast_cancer.target[0:569]
  4. samples_0 = x[y==0, :]
  5. samples_1 = x[y==1, :]
  6. # 实现可视化
  7. plt.figure()
  8. plt.scatter(samples_0[:,0],samples_0[:,1],marker='o',color='r')
  9. plt.scatter(samples_1[:,0],samples_1[:,1],marker='x',color='y')
  10. plt.xlabel('mean radius')
  11. plt.ylabel('mean texture')
  12. plt.show()

  1. # 绘制每个特征直方图,显示特征值的分布情况。
  2. for i, feature_name in enumerate(breast_cancer.feature_names):
  3. plt.figure(figsize=(6, 4))
  4. sns.histplot(breast_cancer.data[:, i], kde=True)
  5. plt.xlabel(feature_name)
  6. plt.ylabel("数量")
  7. plt.title("{}直方图".format(feature_name))
  8. plt.show()

  1. # 绘制箱线图,展示每个特征最小值、第一四分位数、中位数、第三四分位数和最大值概括。
  2. plt.figure(figsize=(10, 6))
  3. sns.boxplot(data=breast_cancer.data, orient="v")
  4. plt.xticks(range(len(breast_cancer.feature_names)), breast_cancer.feature_names, rotation=90)
  5. plt.xlabel("特征")
  6. plt.ylabel("值")
  7. plt.title("特征箱线图")
  8. plt.show()

1.3. Fehlende Werte und Ausreißer

  1. # 创建DataFrame对象
  2. df = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
  3. # 检测缺失值
  4. print("缺失值数量:")
  5. print(df.isnull().sum())
  6. # 检测异常值
  7. print("异常值统计信息:")
  8. print(df.describe())
  9. # 使用.describe()方法获取数据集的统计信息,包括计数、均值、标准差、最小值、25%分位数、中位数、75%分位数和最大值。

1.4. Relevanz

  1. # 创建DataFrame对象
  2. df = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
  3. # 计算相关系数
  4. correlation_matrix = df.corr()
  5. # 可视化相关系数热力图
  6. plt.figure(figsize=(10, 8))
  7. sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm")
  8. plt.title("Correlation Heatmap")
  9. plt.show()

2. API

  1. sklearn.linear_model.LogisticRegression
  2. 导入:
  3. from sklearn.linear_model import LogisticRegression
  4. 语法:
  5. LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
  6. solver可选参数:{'liblinear', 'sag', 'saga','newton-cg', 'lbfgs'},
  7. 默认: 'liblinear';用于优化问题的算法。
  8. 对于小数据集来说,“liblinear”是个不错的选择,而“sag”和'saga'对于大型数据集会更快。
  9. 对于多类问题,只有'newton-cg''sag''saga''lbfgs'可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
  10. penalty:正则化的种类
  11. C:正则化力度

2. Prozess

2.1. Daten abrufen

  1. from sklearn.datasets import load_breast_cancer
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.linear_model import LogisticRegression
  4. # 获取数据
  5. breast_cancer = load_breast_cancer()

2.2. Datenvorverarbeitung

  1. # 划分数据集
  2. x_train,x_test,y_train,y_test = train_test_split(breast_cancer.data, breast_cancer.target, test_size=0.2, random_state=1473)

2.3. Feature-Engineering

2.4. Modellschulung

  1. # 实例化学习器
  2. lr = LogisticRegression(max_iter=10000)
  3. # 模型训练
  4. lr.fit(x_train, y_train)
  5. print("建立的逻辑回归模型为:n", lr)

 

2.5. Modellbewertung

  1. # 用模型计算测试值,得到预测值
  2. y_pred = lr.predict(x_test)
  3. print('预测前20个结果为:n', y_pred[:20])
  4. # 求出预测结果的准确率和混淆矩阵
  5. from sklearn.metrics import accuracy_score, confusion_matrix,precision_score,recall_score
  6. print("预测结果准确率为:", accuracy_score(y_test, y_pred))
  7. print("预测结果混淆矩阵为:n", confusion_matrix(y_test, y_pred))
  8. print("预测结果查准率为:", precision_score(y_test, y_pred))
  9. print("预测结果召回率为:", recall_score(y_test, y_pred))

  1. from sklearn.metrics import roc_curve,roc_auc_score,auc
  2. fpr,tpr,thresholds=roc_curve(y_test,y_pred)
  3. plt.plot(fpr, tpr)
  4. plt.axis("square")
  5. plt.xlabel("假正例率/False positive rate")
  6. plt.ylabel("正正例率/True positive rate")
  7. plt.title("ROC curve")
  8. plt.show()
  9. print("AUC指标为:",roc_auc_score(y_test,y_pred))

 

  1. # 求出预测取值和真实取值一致的数目
  2. num_accu = np.sum(y_test == y_pred)
  3. print('预测对的结果数目为:', num_accu)
  4. print('预测错的结果数目为:', y_test.shape[0]-num_accu)
  5. print('预测结果准确率为:', num_accu/y_test.shape[0])

2.6. Ergebnisvorhersage

Das Modell, das die Modellbewertung durchläuft, kann zur Vorhersage durch den realen Wert ersetzt werden.


Alte Träume können noch einmal durchlebt werden, mal sehen:Maschinelles Lernen (5) – Überwachtes Lernen (5) – Lineare Regression 2
Wenn Sie wissen möchten, was als nächstes passiert, werfen wir einen Blick darauf:Maschinelles Lernen (5) – Überwachtes Lernen (7) – SVM1