Teknologian jakaminen

Koneoppiminen (5) -- Ohjattu oppiminen (6) -- Logistinen regressio

2024-07-12

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

Sisällysluettelo ja linkit artikkelisarjoihin

Edellinen artikkeli:Koneoppiminen (5) -- Ohjattu oppiminen (5) -- Lineaarinen regressio 2
Seuraava artikkeli:Koneoppiminen (5) -- Valvottu oppiminen (7) -- SVM1


Esipuhe

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

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

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

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


1. Yleisön ymmärtäminen ja määritelmä

1. Mikä on logistinen regressio (mitä)

Logistinen regressio = lineaarinen regressio + sigmoidifunktio

Logistinen regressio (Logistic Regression) on yksinkertaisesti löytää suora viiva binääritietojen jakamiseksi.

2. Logistisen regression tarkoitus (miksi)

Ratkaise binääriluokittelutehtävä luokittelemalla tiettyyn luokkaan kuuluvat objektittodennäköisyysarvoSen määrittämiseksi, kuuluuko se tiettyyn luokkaan, tämä luokka merkitään oletuksena arvolla 1 (positiivinen esimerkki) ja toinen luokka on merkitty 0:ksi (negatiivinen esimerkki).

3. Kuinka löytää tämä rivi (Kuinka)

Itse asiassa tämä on samanlainen kuin lineaarinen regressiovaihe. Ero on menetelmissä, joita käytetään "mallin sovitusvaikutuksen tarkistamiseen" ja "mallin sijaintikulman säätämiseen".

  1. Piirrä suora satunnaisesti alkuperäiseksi suoraksi
  2. Tarkista sen istuvuus,
  3. Jos se ei ole paras (kynnys saavutettu), säädä viivan sijaintia ja kulmaa
  4. Toista vaiheita 2 ja 3, kunnes saat parhaan tuloksen (saavutat asetetun kynnyksen) ja lopuksi haluamamme mallin.

Sinun on käytettävä funktiota (sigmoidifunktiota) kartoittaaksesi syötetiedot välille 0-1, ja jos funktion arvo on suurempi kuin 0,5, sen arvoksi katsotaan 1, muuten se on 0. Tämä voidaan muuntaa probabilistiseksi esitykseksi.

2. Periaatteen ymmärtäminen ja kaavat

1. Perceptron

1.1 Ongelman kuvaus

Ota kuvien luokittelu esimerkkinä, jaa kuvat pysty- ja vaakasuoraan

Näin nämä tiedot näytetään kaaviossa. Jotta eriväriset pisteet (eri kategoriat) voidaan erottaa kaaviossa, piirretään tällainen viiva. Tämän luokituksen tarkoituksena on löytää tällainen viiva.

Tämä on "suora, joka tekee painovektorista normaalivektorin" (olkoon painovektorin kohtisuorassa viivaan nähden)

w on painovektori, mikä tekee siitä normaalivektorin suoran, parillisen

1.2 Perceptron-malli

Malli, joka hyväksyy useita arvoja, kertoo kunkin arvon vastaavalla painollaan ja lopulta tulostaa summan.

1.3 Erotteleva toiminto

Sisätulo on vektorien välisen samankaltaisuuden mitta. Positiivinen tulos osoittaa samankaltaisuutta, arvo 0 osoittaa pystysuoraa ja negatiivinen tulos erilaisuutta.

käyttääSe on parempi ymmärtää, koska |w| ja |x| ovat molemmat positiivisia lukuja, joten sisätulon merkki on cosθ, eli jos se on pienempi kuin 90 astetta, se on samanlainen ja jos se on suurempi kuin. 90 astetta, se on erilainen, eli

1.4 Parametriarvio (painon päivityslauseke)

Jos se on yhtä suuri kuin alkuperäinen tarra-arvo, painovektoria ei päivitetä. Jos se ei ole sama kuin alkuperäinen tarran arvo, painovektorin päivittämiseen käytetään vektorin lisäystä.

Kuten kuvasta näkyy, jos se ei ole sama kuin alkuperäinen etiketti, niin

suora viiva päivityksen jälkeen

Päivityksen jälkeen tasa

Vaiheet: Määritä ensin satunnaisesti suora (eli määritä satunnaisesti painovektori w), korvaa reaaliarvodata x ja hanki arvo (1 tai -1) erotusfunktion avulla alkuperäiseen etiketin arvoon, painovektori ei ole Päivitä, jos se eroaa alkuperäisestä tarran arvosta, käytä vektorin lisäystä painovektorin päivittämiseen.

! ! !Huomautus: Perceptron voi ratkaista vain lineaarisesti erotettavia ongelmia
Lineaarisesti erotettavissa: tapaukset, joissa suoria viivoja voidaan käyttää luokitukseen
Lineaarinen erottamattomuus: ei voida luokitella suorilla viivoilla

2. sigmoidifunktio

Musta on sigmoiditoiminto, punainen on askelfunktio (epäjatkuva)

Toiminta: Logistisen regression syöte on lineaarisen regression tulos.Voimme saada ennustetun arvon lineaarisessa regressiossa. Sigmoid-funktio kartoittaa minkä tahansa syötteen [0,1]-väliin, jolloin muunnos arvosta todennäköisyyteen on luokitustehtävä.

3. Logistinen regressio

3.1 Mallin määritelmä

Logistinen regressio = lineaarinen regressio + sigmoidifunktio

Lineaarinen regressio:

sigmoidifunktio:

Logistinen regressio:

Jos haluat antaa y:n edustaa tunnistetta, muuta se muotoon:

Käytä todennäköisyyksiä:

3.2 Erotteleva toiminto

Eli luokat voidaan erottaa todennäköisyydellä

3.3 Päätösraja

Se voidaan kirjoittaa uudelleen seuraavasti:

kun

Korvaavat tiedot:

Sellainen kuva on olemassa

Tiedon luokittelussa käytetty suora on päätösraja

3.4 Objektiivifunktio (logi todennäköisyysfunktio)

Haluamme tämän:
Kun y=1, P(y=1|x) on suurin
Kun y=0, P(y=0|x) on suurin

Todennäköisyysfunktio (yhteinen todennäköisyys): tässä on todennäköisyys, jonka haluamme maksimoida

Log likelihood -funktio: Todennäköisyysfunktiota on vaikea erottaa suoraan toisistaan, ja logaritmi on otettava ensin

Muotoilun jälkeen siitä tulee:

3.4. Parametrien arvio (gradientin lasku)

Todennäköisyysfunktion erotus:

3. Edut ja haitat

3.1 Edut:

1. Yksinkertainen toteuttaa: Logistinen regressio on yksinkertainen algoritmi, joka on helppo ymmärtää ja toteuttaa.
2. Korkea laskennallinen tehokkuus: Logistisella regressiolla on suhteellisen pieni määrä laskentaa ja se soveltuu suuriin tietokokonaisuuksiin.
3. Vahva tulkitavuus: Logistisen regression tulostulokset ovat todennäköisyysarvoja, jotka voivat intuitiivisesti selittää mallin tuoton.

3.2 Haitat:

1. Lineaarisen erotettavuuden vaatimukset: Logistinen regressio on lineaarinen malli ja toimii huonosti epälineaarisissa erotettavissa olevissa ongelmissa.
2. Ominaisuuden korrelaatioongelma: Logistinen regressio on herkempi syöteominaisuuksien väliselle korrelaatiolle Kun ominaisuuksien välillä on vahva korrelaatio, se voi aiheuttaa mallin suorituskyvyn heikkenemistä.
3. Ylisovitusongelma: Kun näyteominaisuuksia on liikaa tai näytteiden määrä on pieni, logistinen regressio on altis ylisovitusongelmille.

3. **Algoritmin toteutus

1. Hanki tietoja

  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. Tietojen käsittely

  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.Sigmoid-funktio ja erottelutoiminto

  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. Parametrien asetus ja koulutus

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

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

  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. Käyttöliittymän toteutus

1. Johdatus rintasyöpätietoihin

1.1, API

from sklearn.datasets import load_breast_cancer

1.2 Perustiedot

  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 Puuttuvat arvot ja poikkeamat

  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 Relevanssi

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

2.1. Hanki tiedot

  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 Tietojen esikäsittely

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

2.4 Mallikoulutus

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

 

2.5 Mallin arviointi

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

Mallin arvioinnin jälkeen läpäisevä malli voidaan korvata ennusteen todellisella arvolla.


Vanhat unelmat voidaan elää uudelleen, katsotaanpa:Koneoppiminen (5) -- Ohjattu oppiminen (5) -- Lineaarinen regressio 2
Jos haluat tietää, mitä seuraavaksi tapahtuu, katsotaanpa:Koneoppiminen (5) -- Valvottu oppiminen (7) -- SVM1