0

I am new to the box and the A.I program, and I don't know how to solve this problem:

!rm -f winequality-red.csv winequality-white.csv
!wget https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
!wget https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv

import pandas as pd
import numpy as np
import math, random
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d


df_red = pd.read_csv('winequality-red.csv',delimiter=";")

#Como estamos realizando una tarea de clasificación, les asignaremos a todos los vinos tintos la etiqueta 1
df_red["color"] = 1

#El método .head() es muy útil para previsualizar los datos
df_red.head()

df_white = pd.read_csv('winequality-white.csv',delimiter=";")
df_white["color"] = 0  #Asignaremos a todos los vinos blancos la etiqueta 0
df_white.head()


df = pd.concat([df_red, df_white])

#Y mezclamos los datos de los vinos blancos y los tintos
df = df.sample(frac=1).reset_index(drop=True)
df.head()

#Elegimos tres atributos en los que basar la predicción
input_columns = ["citric acid", "residual sugar", "total sulfur dioxide"]
output_columns = ["color"]

#Extraemos los atributos relevantes en los arrays x e y
X = df[input_columns].to_numpy()
Y = df[output_columns].to_numpy()
print("Shape of X:", X.shape)
print("Shape of Y:", Y.shape)
in_features = X.shape[1]

class SingleNeuronModel():
    def __init__(self, in_features):
        #self.w = np.zeros(in_features)
        #self.w_0 = 0.
        # Es preferible definir los pesos iniciales como valores pequeños distribuidos de forma normal
        self.w = 0.01 * np.random.randn(in_features)
        self.w_0 = 0.01 * np.random.randn()
        self.non_zero_tolerance = 1e-8 # add this to divisions to ensure we don't divide by 0

        
    def forward(self, x):
        # Calcular y guardar la preactivación z
        self.z = x @ self.w.T + self.w_0
    
        # Aplicar la función de activación y devolver
        self.a = self.activation(self.z)
        return self.a
  
    def activation(self, z):
        raise ImplementationError("activation method should be implemented by subclass")
    
    # Calcular y guardar el gradiente del output respecto a los pesos
    def gradient(self, x):
        raise ImplementationError("gradient method should be implemented by subclass")
        
    # Actualizar los pesos en función de los gradientes y la tasa de aprendizaje
    def update(self, grad_loss, learning_rate):
        model.w   -= grad_loss * self.grad_w   * learning_rate
        model.w_0 -= grad_loss * self.grad_w_0 * learning_rate

        
# Reimplementar el modelo de regresión de una sola neurona usando la base SingleNeuronModel
class SingleNeuronRegressionModel(SingleNeuronModel):
    # Función de activación lineal para el modelo de regresión
    def activation(self, z):
        return z
    
    # Gradiente del output respecto a los pesos para la activación lineal
    def gradient(self, x):
        self.grad_w = x
        self.grad_w_0 = 1.

        
# ¡Nueva implementación! Modelo de clasificación de una sola neurona
class SingleNeuronClassificationModel(SingleNeuronModel):
    # Función de activación sigmoide para la clasificación
    def activation(self, z):
        return 1 / (1 + np.exp(-z) + self.non_zero_tolerance)

    # Gradiente del output respecto a los pesos para la activación sigmoide
    def gradient(self, x):
        self.grad_w = self.a * (1-self.a) * x
        self.grad_w_0 = self.a * (1-self.a)


def train_model_NLL_loss(model, input_data, output_data, 
                         learning_rate, num_epochs):
    non_zero_tolerance = 1e-8 # Añadir esto a los cálculos de log para garantizar que no tomamos el log de 0
    num_samples = len(input_data)
    for epoch in range(1, num_epochs+1):
        total_loss = 0 # Hacer un seguimiento de la pérdida total en todo el conjunto de datos
            
        for i in range(num_samples):
            x = input_data[i,...]
            y = output_data[i]
            y_predicted = model.forward(x)

            # Función de pérdida de NLL
            loss = -(y * np.log(y_predicted + non_zero_tolerance) + (1-y) * np.log(1-y_predicted + non_zero_tolerance))
            total_loss += loss

            # Gradiente de la predicción respecto a los pesos
            model.gradient(x)

            # Gradiente de la pérdida respecto a la predicción para NLL
            grad_loss = (y_predicted - y)/(y_predicted * (1-y_predicted))
            
            #Actualizar el modelo en función del gradiente
            model.update(grad_loss, learning_rate)
            
        report_every = max(1, num_epochs // 10)
        if epoch == 1 or epoch % report_every == 0: # Cada pocos ciclos, generar un informe
            print("epoch", epoch, "has total loss", total_loss)

# Utilizaremos esta función para evaluar el rendimiento de nuestro clasificador entrenado
def evaluate_classification_accuracy(model, input_data, labels):
    # Contar el número de muestras clasificadas correctamente dado un conjunto de pesos
    correct = 0
    num_samples = len(input_data)
    for i in range(num_samples):
        x = input_data[i,...]
        y = labels[i]
        y_predicted = model.forward(x)
        label_predicted = 1 if y_predicted > 0.5 else 0
        if label_predicted == y:
            correct += 1
      
    accuracy = correct / num_samples
    print("Our model predicted", correct, "out of", num_samples,
          "correctly for", accuracy*100, "% accuracy")
    return accuracy

input_data = np.array(["citric acid", "residual sugar", "total sulfur dioxide"])
labels = ["color"]

def plot_3d_dataset(x, y): 
    x_np_3d = np.array(x)
    x_np_3d.reshape(len(x),3)
    colors = []
    for label in y:
        if label == 0:
            colors.append("red")
        else:
            colors.append("blue")
    fig = plt.figure()
    ax = plt.axes(projection='3d')
    ax.scatter3D(x_np_3d[...,0], x_np_3d[...,1],x_np_3d[...,2], color = colors)
    return ax



def plot_3d_decision_boundary(ax, w, w_0):
  x = np.linspace(-1,4,10)
  y = np.linspace(-1,6,10)
  X,Y = np.meshgrid(x,y)
  Z = (-X*w[0] - Y*w[1] - w_0)/w[2]
  surf = ax.plot_surface(X, Y, Z)
  ax.set_zlim(-10,5)
  return

model = SingleNeuronClassificationModel(in_features=len(input_data[0]))
learning_rate =0.001
epochs = 200

train_model_NLL_loss(model, input_data, labels, learning_rate, epochs)
print("\nFinal weights:")
print(model.w, model.w_0)
evaluate_classification_accuracy(model, input_data, labels)
ax=plot_3d_dataset(input_data, labels)
plot_3d_decision_boundary(ax, model.w, model.w_0)
plt.show()

Utilice Pandas para leer el archivo cvs en un marco de datos Proceso de entrenamiento, utilizando la pérdida de log-verosimilitud negativa,más adecuada para problemas de clasificación The class implementation of the single neuron classifier must be trained to carry out a binary classification of wine by color according to its characteristics. I need help beacouse i´m new in this language.

The error is :

-------------------------------------------------------------------
enter code here       ValueError Traceback (most recent call last)
<ipython-input-19-e78d64c8d9e7> in <module>
      5 epochs = 200
      6 
----> 7 train_model_NLL_loss(model, input_data, labels, learning_rate, epochs)
      8 print("\nFinal weights:")
      9 print(model.w, model.w_0)

1 frames
<ipython-input-14-654d498667a7> in train_model_NLL_loss(model, input_data, output_data, learning_rate, num_epochs)
     68             x = input_data[i,...]
     69             y = output_data[i]
---> 70             y_predicted = model.forward(x)
     71 
     72             # Función de pérdida de NLL

<ipython-input-14-654d498667a7> in forward(self, x)
     11     def forward(self, x):
     12         # Calcular y guardar la preactivación z
---> 13         self.z = x @ self.w.T + self.w_0
     14 
     15         # Aplicar la función de activación y devolver

ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)

0 Answers0