Полная реализация с нуля

Логистическая регрессия используется для моделирования вероятности определенного класса, чтобы ему можно было присвоить значение 0 или 1. Это статистическая модель обучения с учителем. Это стандартный метод бинарной классификации.

Например, вы хотите предсказать, болеет человек диабетом или нет! ИЛИ Допустим, вы хотите узнать выживаемость из любого набора данных ИЛИ Любая почта является спамом (1) или нет (0).

По сути, это метод классификации. Здесь мы увидим двоичную классификацию.

Мы используем сигмовидную функцию в логистической регрессии, так как хотим, чтобы наше значение находилось в диапазоне от 0 до 1, как показано на рисунке ниже.

Функция гипотезы

Объединение обоих даст нам →

Эта функция всегда будет давать нам значение от 0 до 1, что говорит нам о вероятности достижения этой точки. По мере того, как мы приближаемся к предсказанной линии, наши прогнозы становятся менее уверенными (поскольку они запутываются). Мы создаем границу решения, которая: если значение больше 0,5, то это 1, а если меньше 0,5, это класс 0.

Потеря журнала (двоичная кросс-энтропия)

Потеря логистической регрессии

Здесь вы можете увидеть, что правильное значение умножается на прогнозируемое. Первая часть формулы объясняет, когда метка равна 1, умноженному на уверенность в положительном значении балла. Точно так же вторая часть отображается, когда метка равна 0, умноженная на ее уверенность в том, что она отрицательна.

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

Ссылка на блог о линейной регрессии



Градиентный спуск

Мы не использовали отрицательный знак при вычислении производной на фотографии выше, и это единственная разница между линейной регрессией и формулой градиентного спуска логистической регрессии.

Теперь мы готовы к реализации этого →

def sigmoid(x):
    return 1.0/(1.0 + np.exp(-x))
def hypothesis(X,theta):
    # X - entire array (m,n+1)
    # theta - np.array(n+1,1)
    return sigmoid(np.dot(X,theta))
def error(X,y,theta):
    """
    parameters:
    X - (m,n+1)
    Y - (m,1)
    theta - (n+1,1)
    return scalar value of loss
    """
    hi = hypothesis(X,theta)
    e = -1*np.mean(y*np.log(hi)+(1-y)*np.log(1-hi))
    return e
def gradient(X,y,theta):
    """
    parameters:
    X - (m,n+1)
    Y - (m,1)
    theta - (n+1,1)
    return vector
    """
    hi = hypothesis(X,theta)
    grad = np.dot(X.T,(y-hi))
    return grad/X.shape[0]
def gradient_descent(X,y,lr=0.1,max_itr=500):
    n = X.shape[1]
    theta = np.zeros((n,1))
    
    error_list = []
    for i in range(max_itr):
        err = error(X,y,theta)
        error_list.append(err)
        
        grad = gradient(X,y,theta)
        
        theta = theta + lr*grad
    return theta ,error_list
def predict(X,theta):
    h = hypothesis(X,theta)
    output = np.zeros(h.shape)
    output[h>=0.5] = 1
    output = output.astype('int')
    return output

Теперь просто примените логистическую регрессию к любой из бинарных моделей, таких как классификация диабета, или вы можете импортировать набор данных груди_cancer из sklearn, а затем применить это !!