[Conceptos básicos del aprendizaje automático] Regresión de probabilidad logarítmica (logística) para clasificar a los supervivientes del Titanic

La regresión logística (logística) clasifica a los supervivientes del Titanic

La regresión logística es una regresión de verosimilitud logarítmica, que puede considerarse la red neuronal artificial más simple. Es seleccionar una línea (hiperplano) para dividir el conjunto de datos en dos partes ajustando los datos para lograr la clasificación.


1. Conocimiento teórico de la regresión logarítmica de verosimilitud

El núcleo de la regresión logística se muestra en la siguiente figura.Nuestro objetivo es encontrar la w y b óptimas . W y b pueden representar una línea recta (hiperplano) para dividir el conjunto de datos en diferentes partes.
estructura

1. Definir hiperplano

Necesitamos encontrar una línea (hiperplano) para dividir el conjunto de datos en dos partes. La definición del hiperplano es la siguiente (donde w0 yb son equivalentes):
Hiperplano

2. Función activa

Para el problema de clasificación, es clasificar la categoría de los datos. Para un problema de clasificación binaria, tenemos que introducir una función de salida de clasificación binaria. Solo puede ser 0 o 1 para los datos de entrada. A continuación, presentaré dos funciones de activación: Sigmod y Tanh. Sus imágenes son las siguientes (azul es Sigmode, rojo es Tanh).
Función de activación

  • Para sigmod, cuando ingresamos un valor, si la función sigmod es> = 0.5, consideramos que es 1, de lo contrario es 0.
  • Para tanh, cuando ingresamos un valor, si la función tanh es> = 0, consideramos que es 1, de lo contrario es 0.
import numpy as np
# 激活函数

# sigmod

def sigmod(x):
    return np.array(1.0/(1.0 + np.exp(-x)))

# tanh

def tanh(x):
    return (np.exp(x) - np.exp(-x))/(np.exp(x) + np.exp(-x))

3. Función de pérdida (función de pérdida)

Para obtener los parámetros óptimos del hiperplano, necesitamos definir una función de pérdida para iterar para minimizar el valor de la función de pérdida y obtener los parámetros óptimos. La función de pérdida se define de la siguiente manera:
Función de pérdida
donde y es el valor predicho, y_que es el valor real e y contiene los parámetros w y b .

4. Descenso en gradiente

Iterar a lo largo de la dirección del gradiente es la convergencia más rápida. Aquí está la actualización de retropropagación . El alfa en los gráficos w y b representa la tasa de aprendizaje
Actualizar w y b

5. Pasos de cálculo

De acuerdo con lo anterior, se pueden obtener todos los pasos de cálculo (es necesario especificar el número de iteraciones): El
pasos de cálculo
código para obtener los parámetros para el descenso de gradiente es el siguiente:

# 梯度下降求解

def GD(input_data_x, input_data_y, alpha = 0.001, itera = 1000):
    [n, m] = input_data_x.shape
    # 初始化w,b
    w = np.ones((n, 1))
    b = np.ones(1)
    
    for i in range(itera):
        z = np.dot(w.T, input_data_x) + b
        a = sigmod(z)
        
        # error
        dz = a - input_data_y
        # print(w, b)
        # 更新 w 和 b
        b -= alpha * (np.sum(dz))/m
        w -= alpha * np.dot(input_data_x, dz.T)/m
    
    # print(w, b)
    return w, b

w, b = GD(train_data.T, train_label.T)

Prueba en el conjunto de datos de prueba:

def test(test_data, test_label, w, b):
    sigmod_result = sigmod(np.dot(w.T, test_data) + b)
    result = []
    # 判断分类
    for sr in sigmod_result[0]:
        if sr >= 0.5: 
            result.append(1)
        else:
            result.append(0)

    error = 0
    for i in range(len(result)):
        if result[i] != test_label[0][i]:
            error += 1
    
    print(error/len(result))

test(test_data.T, test_label.T, w, b)

La regresión logística implementada en este trabajo tiene una tasa de error de 0.23979591836734693 para la clasificación de los sobrevivientes del Titanic.


2. Datos (conjunto de datos de supervivientes del Titanic)

El conjunto de datos para este artículo proviene de Kaggle / titanic

1. Descripción de la función de datos

  • edad Edad del pasajero
  • tarifa
  • sexo sexo
  • clase de pc Nivel socioeconómico 1 (nivel superior) 2 (nivel medio) 3 (nivel inferior)
  • sobrevivido 1 (sobrevivido) 0 (muerto)

Los supervivientes se clasificaron según la edad del pasajero, tarifa, sexo, nivel socioeconómico, etc.

2. Importar datos

Necesitamos dividir los datos importados en dos partes: conjunto de entrenamiento y conjunto de prueba. El conjunto de entrenamiento representa el 70% del conjunto de datos total y el resto es el conjunto de prueba.

import pandas as pd 

def load_csv_data():
    csv_file = pd.read_csv(r'F:\UCAS\Work\Course\2020\ML\ML-Learning\ML_action\4.LogicRegression\data\titanic\train_and_test2.csv')
    data_set = np.array(csv_file)

    # 分类 最后一行为是否幸存
    survived = data_set[:, [-1]]
    survived = survived.astype(np.int)
    # 特征 其中第1, 2, 3, 21列 分别为 年龄, 船票, 性别, 社会经济地位
    # input_data = data_set[:, [1,2,3,21]]
    input_data = data_set[:, [1,2]]
    return input_data, survived

Partición de datos

# 导入数据
input_data, label = load_csv_data()

# ninput_data = normlize(input_data)
# print(input_data, label)
# 划分数据
m, n = input_data.shape
train_size = int(m*0.7)
# 训练集
train_data = input_data[0:train_size, :]
train_label = label[0:train_size]
# 测试集
test_data = input_data[train_size:-1, :]
test_label = label[train_size:-1]

3. Visualización

La siguiente figura muestra la imagen visualizada después de usar Logisitic para dividir. Rojo significa muerte y verde significa supervivencia. El eje horizontal representa la edad y el eje vertical representa el precio del boleto. En general, se puede concluir que las personas que son más jóvenes y tienen precios de boletos más altos tienen una tasa de supervivencia más alta. También puede tratar el género u otras características, que no se repetirán aquí.
Visualización

from matplotlib import pyplot as plt

colors = ['green' for x in range(0, train_size)]
for i in range(len(colors)):
    if train_label[i] == 0:
        colors[i] = 'red'
x = np.linspace(0, 88)
y = -(w[0]*x + b)/w[1]
plt.plot(x, y, color='blue')

plt.scatter(train_data[:, 0], train_data[:, 1], color = colors)
plt.show()

referencias

  1. Curso de aprendizaje profundo Andrew Ng
  2. Libros prácticos de aprendizaje automático
  3. Curso de aprendizaje automático 2020 de la Universidad Nacional de Ciencia y Tecnología PPT
  4. https://apachecn.gitee.io/ailearning/#/docs/ml/5

Supongo que te gusta

Origin blog.csdn.net/qq_37753409/article/details/109209876
Recomendado
Clasificación