Berbagi teknologi

Pembelajaran Mesin (5) -- Pembelajaran yang Diawasi (6) -- Regresi Logistik

2024-07-12

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

Daftar isi dan tautan ke rangkaian artikel

Artikel sebelumnya:Pembelajaran Mesin (5) -- Pembelajaran yang Diawasi (5) -- Regresi Linier 2
Artikel selanjutnya:Pembelajaran Mesin (5) -- Pembelajaran yang Diawasi (7) --SVM1


Kata pengantar

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

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

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

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


1. Pemahaman dan definisi populer

1. Apa itu regresi logistik (Apa)

Regresi logistik = regresi linier + fungsi sigmoid

Regresi logistik (Logistic Regression) hanyalah mencari garis lurus untuk membagi data biner.

2. Tujuan regresi logistik (Mengapa)

Selesaikan masalah klasifikasi biner dengan mengklasifikasikan objek yang termasuk dalam kategori tertentunilai probabilitasUntuk menentukan apakah termasuk dalam kategori tertentu, kategori ini ditandai sebagai 1 (contoh positif) secara default, dan kategori lainnya akan ditandai sebagai 0 (contoh negatif).

3. Bagaimana menemukan baris ini (Bagaimana)

Sebenarnya langkah ini mirip dengan langkah regresi linier. Perbedaannya terletak pada metode yang digunakan untuk "memeriksa efek kesesuaian model" dan "menyesuaikan sudut posisi model".

  1. Gambarlah garis lurus secara acak sebagai garis lurus awal
  2. Periksa efek pasnya,
  3. Jika bukan yang terbaik (ambang batas tercapai), sesuaikan posisi garis dan sudutnya
  4. Ulangi langkah 2 dan 3 hingga efek terbaik (mencapai ambang batas yang ditetapkan), dan terakhir model yang kita inginkan.

Anda perlu menggunakan suatu fungsi (fungsi sigmoid) untuk memetakan data masukan antara 0-1, dan jika nilai fungsi lebih besar dari 0,5, maka dianggap 1, jika tidak maka 0. Ini dapat diubah menjadi representasi probabilistik.

2. Pengertian Prinsip dan Rumusannya

1. Perseptron

1.1.Deskripsi masalah

Ambil contoh klasifikasi gambar, bagi gambar menjadi vertikal dan horizontal

Beginilah cara data ini ditampilkan pada grafik. Untuk memisahkan titik-titik dengan warna berbeda (kategori berbeda) dalam grafik, kita menggambar garis seperti itu. Tujuan klasifikasi ini adalah untuk menemukan garis tersebut.

Ini adalah "garis lurus yang menjadikan vektor berat menjadi vektor normal" (biarkan vektor berat tegak lurus terhadap garis)

w adalah vektor bobot; menjadikannya garis lurus dari vektor normal, genap

1.2

Model yang menerima beberapa nilai, mengalikan setiap nilai dengan bobotnya masing-masing, dan akhirnya mengeluarkan jumlahnya.

1.3.Fungsi diskriminan

Hasil kali dalam merupakan ukuran derajat kemiripan antar vektor. Hasil positif menunjukkan kesamaan, nilai 0 menunjukkan vertikalitas, dan hasil negatif menunjukkan ketidaksamaan.

menggunakanLebih baik dipahami, karena |w| dan |x| sama-sama bilangan positif, jadi tanda hasil kali dalam adalah cosθ, yaitu jika kurang dari 90 derajat maka sama, dan jika lebih besar dari 90 derajat, itu berbeda

1.4. Estimasi parameter (ekspresi pembaruan bobot)

Jika sama dengan nilai label asli maka vektor bobot tidak akan diperbarui. Jika tidak sama dengan nilai label asli maka penambahan vektor akan digunakan untuk memperbarui vektor bobot.

Seperti terlihat pada gambar, jika tidak sama dengan label aslinya, maka

garis lurus setelah pembaruan

Setelah pembaruan, sama

Langkah-langkah: Pertama, tentukan garis lurus secara acak (yaitu, tentukan secara acak vektor bobot w), substitusikan data nilai riil x ke dalam hasil kali dalam, dan dapatkan nilai (1 atau -1) melalui fungsi diskriminan ke nilai label asli, vektor bobot tidak diperbarui, jika berbeda dengan nilai label asli, gunakan penjumlahan vektor untuk memperbarui vektor bobot.

! ! !Catatan: Perceptron hanya dapat menyelesaikan permasalahan yang dapat dipisahkan secara linier
Dapat dipisahkan secara linier: kasus di mana garis lurus dapat digunakan untuk klasifikasi
Ketidakterpisahan linier: tidak dapat diklasifikasikan berdasarkan garis lurus

2. fungsi sigmoid

Hitam fungsi sigmoid, merah fungsi langkah (terputus-putus)

Fungsi: Input regresi logistik merupakan hasil regresi linier.Kita bisa mendapatkan nilai prediksi dalam regresi linier. Fungsi Sigmoid memetakan masukan apa pun ke interval [0,1], sehingga menyelesaikan konversi dari nilai ke probabilitas, yang merupakan tugas klasifikasi.

3. Regresi logistik

3.1.Definisi model

Regresi logistik = regresi linier + fungsi sigmoid

Regresi linier:

fungsi sigmoid:

Regresi logistik:

Agar y mewakili label, ubah menjadi:

Untuk melakukan probabilitas gunakan:

3.2.Fungsi diskriminan

Artinya, kategori dapat dibedakan berdasarkan probabilitas

3.3. Batasan keputusan

Itu dapat ditulis ulang sebagai berikut:

Kapan

Data pengganti:

Ada gambaran seperti itu

Garis lurus yang digunakan untuk klasifikasi data adalah batas keputusan

3.4. Fungsi tujuan (fungsi kemungkinan log)

Yang kami inginkan adalah ini:
Jika y=1, P(y=1|x) adalah yang terbesar
Jika y=0, P(y=0|x) adalah yang terbesar

Fungsi kemungkinan (probabilitas gabungan): inilah probabilitas yang ingin kita maksimalkan

Fungsi kemungkinan log: Sulit untuk membedakan fungsi kemungkinan secara langsung, dan logaritma harus diambil terlebih dahulu

Setelah mengalami deformasi, menjadi:

3.4. Estimasi parameter (penurunan gradien)

Diferensiasi fungsi kemungkinan:

3. Kelebihan dan Kekurangan

3.1.Keuntungan:

1. Sederhana untuk diimplementasikan: Regresi logistik adalah algoritma sederhana yang mudah dipahami dan diimplementasikan.
2. Efisiensi komputasi yang tinggi: Regresi logistik memiliki jumlah penghitungan yang relatif kecil dan cocok untuk kumpulan data berskala besar.
3. Interpretabilitas yang kuat: Hasil keluaran regresi logistik berupa nilai probabilitas, yang secara intuitif dapat menjelaskan keluaran model.

3.2.Kekurangan:

1. Persyaratan keterpisahan linier: Regresi logistik adalah model linier dan berkinerja buruk untuk masalah separasi nonlinier.
2. Masalah korelasi fitur: Regresi logistik lebih sensitif terhadap korelasi antar fitur masukan. Jika terdapat korelasi yang kuat antar fitur, hal tersebut dapat menyebabkan performa model menurun.
3. Masalah overfitting: Jika fitur sampel terlalu banyak atau jumlah sampel sedikit, regresi logistik rentan terhadap masalah overfitting.

3. **Implementasi algoritma

1. Dapatkan datanya

  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. Pengolahan data

  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. Fungsi sigmoid dan fungsi diskriminan

  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. Pengaturan dan pelatihan parameter

  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. Konfirmasi gambar

  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.Verifikasi

  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. Implementasi antarmuka

1. Pengantar kumpulan data kanker payudara

1.1、API

from sklearn.datasets import load_breast_cancer

1.2.Informasi dasar

  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. Nilai dan outlier yang hilang

  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.Relevansi

  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. Proses

2.1.Mendapatkan data

  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.Pemrosesan awal data

  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. Rekayasa fitur

2.4.Pelatihan teladan

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

 

2.5.Evaluasi model

  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.Prediksi hasil

Model yang lolos setelah evaluasi model dapat disubstitusikan ke dalam nilai prediksi yang sebenarnya.


Mimpi lama bisa dihidupkan kembali, yuk simak:Pembelajaran Mesin (5) -- Pembelajaran yang Diawasi (5) -- Regresi Linier 2
Ingin tahu kelanjutannya, yuk simak:Pembelajaran Mesin (5) -- Pembelajaran yang Diawasi (7) --SVM1