Compartir tecnología

Aprendizaje automático (5) - Aprendizaje supervisado (6) - Regresión logística

2024-07-12

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

Índice de contenidos y enlaces a series de artículos.

Artículo anterior:Aprendizaje automático (5) - Aprendizaje supervisado (5) - Regresión lineal 2
Artículo siguiente:Aprendizaje automático (5) - Aprendizaje supervisado (7) -SVM1


Prefacio

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

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

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

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


1. Comprensión y definición populares

1. ¿Qué es la regresión logística (Qué)?

Regresión logística = regresión lineal + función sigmoidea

La regresión logística (Regresión logística) consiste simplemente en encontrar una línea recta para dividir datos binarios.

2. El propósito de la regresión logística (por qué)

Resuelva el problema de clasificación binaria clasificando los objetos que pertenecen a una determinada categoría.valor de probabilidadPara determinar si pertenece a una determinada categoría, esta categoría se marca como 1 (ejemplo positivo) de forma predeterminada y la otra categoría se marcará como 0 (ejemplo negativo).

3. Cómo encontrar esta línea (Cómo)

De hecho, esto es similar al paso de regresión lineal. La diferencia radica en los métodos utilizados para "verificar el efecto de ajuste del modelo" y "ajustar el ángulo de posición del modelo".

  1. Dibuja una línea recta al azar como línea recta inicial
  2. Compruebe su efecto de ajuste,
  3. Si no es el mejor (umbral alcanzado), ajuste la posición y el ángulo de la línea.
  4. Repetir los pasos 2 y 3 hasta obtener el mejor efecto (alcanzar el umbral establecido), y finalmente el modelo que queremos.

Debe usar una función (función sigmoidea) para asignar los datos de entrada entre 0 y 1, y si el valor de la función es mayor que 0,5, se considera 1; de lo contrario, es 0. Esto se puede convertir en una representación probabilística.

2. Comprensión de principios y fórmulas.

1. perceptrón

1.1. Descripción del problema

Tome la clasificación de imágenes como ejemplo, divida las imágenes en vertical y horizontal.

Así es como se muestran estos datos en el gráfico. Para separar los puntos de diferentes colores (diferentes categorías) en el gráfico, trazamos dicha línea. El propósito de esta clasificación es encontrar dicha línea.

Esta es una "línea recta que hace que el vector de peso sea un vector normal" (deje que el vector de peso sea perpendicular a la línea)

w es el vector de peso; por lo que es una línea recta del vector normal, par;

1.2. modelo de perceptrón

Un modelo que acepta múltiples valores, multiplica cada valor por su peso respectivo y finalmente genera la suma.

1.3. Función discriminante

El producto interno es una medida del grado de similitud entre vectores. Un resultado positivo indica similitud, un valor de 0 indica verticalidad y un resultado negativo indica disimilitud.

usarEs mejor entenderlo, porque |w| y |x| son ambos números positivos, por lo que el signo del producto interno es cosθ, es decir, si es menor que 90 grados, es similar y si es mayor que 90 grados, es diferente, es decir

1.4. Estimación de parámetros (expresión de actualización de peso)

Si es igual al valor de la etiqueta original, el vector de peso no se actualizará. Si no es igual al valor de la etiqueta original, se utilizará la suma de vectores para actualizar el vector de peso.

Como se muestra en la figura, si no es igual a la etiqueta original, entonces

línea recta después de la actualización

Después de la actualización, igual

Pasos: Primero determine aleatoriamente una línea recta (es decir, determine aleatoriamente un vector de peso w), sustituya un dato de valor real x en el producto interno y obtenga un valor (1 o -1) a través de la función discriminante. al valor de la etiqueta original, el vector de peso no se actualiza; si es diferente del valor de la etiqueta original, utilice la suma de vectores para actualizar el vector de peso.

! ! !Nota: El perceptrón sólo puede resolver problemas linealmente separables.
Linealmente separable: casos en los que se pueden utilizar líneas rectas para la clasificación
Inseparabilidad lineal: no se puede clasificar por líneas rectas

2. función sigmoidea

El negro es la función sigmoidea, el rojo es la función escalonada (discontinua)

Función: La entrada de la regresión logística es el resultado de la regresión lineal.Podemos obtener un valor predicho en regresión lineal. La función sigmoidea asigna cualquier entrada al intervalo [0,1], completando así la conversión de valor a probabilidad, que es una tarea de clasificación.

3. Regresión logística

3.1. Definición del modelo

Regresión logística = regresión lineal + función sigmoidea

Regresión lineal:

función sigmoidea:

Regresión logística:

Para que y represente la etiqueta, cámbiela a:

Para hacer probabilidades use:

3.2. Función discriminante

Es decir, las categorías se pueden distinguir por probabilidad.

3.3. Límite de decisión

Se puede reescribir de la siguiente manera:

cuando

Datos sustitutos:

Hay tal foto

La línea recta utilizada para la clasificación de datos es el límite de decisión.

3.4. Función objetivo (función logarítmica de verosimilitud)

Lo que queremos es esto:
Cuando y = 1, P (y = 1 | x) es el mayor
Cuando y = 0, P (y = 0 | x) es el mayor

Función de probabilidad (probabilidad conjunta): aquí está la probabilidad que queremos maximizar

Función logarítmica de verosimilitud: es difícil diferenciar directamente la función de verosimilitud y primero es necesario tomar el logaritmo

Después de la deformación, se convierte en:

3.4. Estimación de parámetros (descenso de gradiente)

Diferenciación de la función de verosimilitud:

3. Ventajas y desventajas

3.1.Ventajas:

1. Fácil de implementar: la regresión logística es un algoritmo simple que es fácil de entender e implementar.
2. Alta eficiencia computacional: la regresión logística tiene una cantidad de cálculo relativamente pequeña y es adecuada para conjuntos de datos a gran escala.
3. Fuerte interpretabilidad: los resultados de la regresión logística son valores de probabilidad que pueden explicar intuitivamente el resultado del modelo.

3.2. Desventajas:

1. Requisitos de separabilidad lineal: la regresión logística es un modelo lineal y funciona mal para problemas separables no lineales.
2. Problema de correlación de características: la regresión logística es más sensible a la correlación entre las características de entrada. Cuando existe una fuerte correlación entre las características, puede hacer que el rendimiento del modelo disminuya.
3. Problema de sobreajuste: cuando hay demasiadas características de muestra o el número de muestras es pequeño, la regresión logística es propensa a problemas de sobreajuste.

3. **Implementación del algoritmo

1. Obtener datos

  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. Procesamiento de datos

  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.Función sigmoidea y función discriminante.

  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. Configuración de parámetros y entrenamiento

  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. Confirmación del dibujo

  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.Verificación

  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. Implementación de la interfaz

1. Introducción al conjunto de datos sobre cáncer de mama.

1.1, API

from sklearn.datasets import load_breast_cancer

1.2. Información básica

  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. Valores faltantes y valores atípicos

  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.

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

2.1. Obtener datos

  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. Preprocesamiento de datos

  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. Ingeniería de características

2.4. Entrenamiento modelo

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

 

2.5. Evaluación del modelo

  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. Predicción de resultados

El modelo que pasa después de la evaluación del modelo se puede sustituir por el valor real para la predicción.


Los viejos sueños se pueden revivir, veamos:Aprendizaje automático (5) - Aprendizaje supervisado (5) - Regresión lineal 2
Si quieres saber qué pasa después, echemos un vistazo:Aprendizaje automático (5) - Aprendizaje supervisado (7) -SVM1