4) Что такое логистическая регрессия в машинном обучении?



Это контролируемый алгоритм машинного обучения, который, как известно, также решает проблемы бинарной классификации. Двоичный означает два, а классификация означает природу (идентификацию класса), чтобы предсказать метку между двумя классами, мы используем двоичную классификацию. Давайте посмотрим на пример для лучшего понимания, здесь у нас есть два класса, которые могут быть истинными (наличие) или ложными (отсутствие), или могут быть 1 или 0. Как и проблема линейной регрессии, которую мы уже обсуждали, мы дадим функции в качестве входных данных x для модели и модель будет предсказывать выход y. В двоичной классификации у вас есть понятие, которое вы должны понять в первую очередь о отрицательном классе и положительном классе. Мы поймем эти термины на примере, допустим, у вас есть набор данных, который содержит характеристики (x) разных животных с метками (y), и вы заинтересованы в определении характеристик кошек и прогнозировании метки с помощью модели, поэтому таким образом кошка будет быть положительным классом, потому что вы заинтересованы в идентификации кошек, а остальные животные будут относиться к отрицательному классу, потому что вы не заботитесь о них.

Функция активации:

Для достижения логистической регрессии мы используем сигмовидную или логистическую функцию, которая дает нам значение от 0 до 1. Внутри этой функции мы реализовали приведенное ниже уравнение, чтобы дать прогноз между 0 и 1, затем мы применяем в нем граничное условие решения. означает, что если f(x) дает нам прогноз больше 0,5, то после применения условия или выстрела потока вывод будет равен 1, а если меньше 0,5, то после применения условия вывод будет равен 0. Для нас очень важно предсказать вывод y между 0 и 1. Так что после получения вывода y мы можем округлить вывод y до 0 и 1.

Как вы можете видеть, x — это ввод, который будет умножаться на вес (w) и добавляться к смещению (b), а сигма — это активация.

функция sigmoid после применения sigmoid мы получим вывод y. Здесь, после получения вывода y, мы сравним этот вывод с фактическим выводом, если оба одинаковы или близки, тогда хорошо, иначе мы проверяем эту вещь, используя функцию потерь, если потеря меньше, чем хорошо, в противном случае мы изменим значение весов и смещения, используя градиент приличный. Это мы будем делать, пока не достигнем ближайшего значения.

Двоичная перекрестная энтропия

Это функция потерь или затрат, также называемая функцией логистических затрат, которую мы используем для задач бинарной или многоуровневой классификации. Эта функция потерь помогает нам оценить потери между прогнозируемым выходом (y_pred) и фактическим выходом (y_actual). Для такого рода задач (классификации) бинарная перекрестная энтропия была бы лучшим подходом между всеми функциями стоимости.

L(f w[ i ],b ), y[i] ) =- ( yi ) log ( fwb ( x[i] ) ) — ( 1 — yi ) log ( 1 — fw[i] , б ( х[i] ) )

Здесь N — количество признаков. Здесь, когда y=1, потери будут меньше, и точно так же, если f(x[i])=0, то функция потерь также будет равна 0.

from distutils.log import warn
import numpy as np
import matplotlib.pyplot as py
x_train=np.array([2,3,5,6,9,1])
y_train=np.array([0,0,1,1,1,0])
np.seterr(divide = 'ignore') 
# np.seterr(divide='warn')
def calculate(x,w,b):
    fx=np.dot(x,w)+b
    return fx
def sigmoid(z):
    fx=1/(1+2.71**(-z))
    return fx
def cost(x,y,w,b):
    m=len(x)
    t_cost=0
    sum_cost=0
    for i in range(m):
        fx=sigmoid(np.dot(x[i],w)+b)
        print("here is the issue ",fx)
        t_cost=-(x[i]*np.log(fx))-((1-x[i])*np.log(1-fx))
        sum_cost+=t_cost
    total_cost=(1/m)*sum_cost
    return total_cost
def gradientLoss(x,y,w,b):
    m=len(x)
    lossW=0
    lossB=0
    sum_loss_w=0
    sum_loss_b=0
    historyW=np.zeros(m)
    historyB=np.zeros(m)
    for i in range(m):
        fx=sigmoid(np.dot(x[i],w)+b)
        loss=fx-y[i]
        lossW=loss*x[i]
        lossB=loss
        historyW[i]=lossW
        historyB[i]=lossB
        sum_loss_w+=lossW
        sum_loss_b+=lossB
    sum_loss_w=(1/m)*sum_loss_w
    sum_loss_b=(1/m)*sum_loss_b
    return sum_loss_w,sum_loss_b

def gradient(x,y,w,b,lr,iterations):
    historyW=np.zeros(iterations)
    historyB=np.zeros(iterations)
    for i in range(iterations):
        gradientW,gradientB=gradientLoss(x,y,w,b)
        w=w-(lr*(gradientW))
        b=b-(lr*(gradientB))
        historyW[i]=w
        historyB[i]=b
    return historyW,historyB
def predict(x,w,b):
    result=np.zeros(len(x))
    for i in range(len(x)):
        output=calculate(x_train[i],w,b)
        if(output>0):
            result[i]=1
        else:
            result[1]=0
    return result    
        
    
w=0.1
b=1
lr=0.1
historyW,historyB=gradient(x_train,y_train,w,b,lr,1000)
print("Weights are ",historyW)
print("Bias are ",historyB)
w=historyW[-1]
b=historyB[-1]
# total_cost=cost(x_train,y_train,w,b)
# print("Cost is ",float(total_cost))

output=predict(x_train,w,b)
print("Output is ",output)
output2=sigmoid(np.dot(x_train,w+b))
print("Sigmoid output is ",output2)
py.scatter(output,output2,c='r')
py.title("Comparison")
py.xlabel("predict")
py.ylabel("sigmoid")
py.show()

Вывод

Здесь переменная истории используется для хранения весов и смещения. Кроме обновления значений веса и смещения у нас есть выходные данные, приведенные ниже. Вы можете сравнить фактические значения y_actual с прогнозируемыми значениями y_pred.

На сегодня мы рассмотрим основы логистической регрессии, а именно, какую функцию стоимости она использует или какую функцию активации она использует. В следующих блогах мы расскажем о более продвинутых вещах.

Первоначально опубликовано на https://dowaste.blogspot.com.