Построение мультиклассового классификатора логистической регрессии без SKlearn с использованием python - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь построить мультиклассовый классификатор логистической регрессии, используя python без библиотеки SKlearn .

Моя цель - написать классификатор для классификации категории приложения (например, здравоохранение, социальные сети и т. Д.) По значениям tf-idf в тестовых данных.

То, что я получил сейчас, - это датафрейм, в котором данные и метки сопоставляются по имени приложения, как показано на рисунке.

enter image description here

На рисунке первый массив 'data' - это значения tf-idf из обучающих данных, а второй массив 'меток' соответствует метке приложения.

Что я теперь знаю, так это то, что я могу использовать логистическую регрессию для изучения весов и смещений для каждой метки, а затем использовать эти значения для прогнозирования метки приложения в тестовых данных. И теперь я могу использовать сигмоидную функцию p = 1.0 / (1.0 + np.exp (-z)), где z - это b + w1x1 + w2x2 + ... + wnxn (b - это смещение, w - это веса, а x - это значение tf-idf в этом случае). Я просто пытаюсь получить вес и уклон с первого пункта. Код выглядит следующим образом:

    # the first training item 
    X = train_data[0, 0:13625]#13625 features
    z = 0.0
    for j in range(len(X)):
        z += W[j] * X[j]
    z += b

    p = 1.0 / (1.0 + np.exp(-z))  # sigmoid function
    y = train_data[1, i]  # I don't know if it is right to use the second item's feature as a target. 

    # update all weights after each train item
    for j in range(0, 13625):  # gradient ascent log likelihood
        W[j] += lr * X[j] * (y - p)  # t - o gives an "add"
    b += lr * (y - p)  # update bias

Я не знаю, правильно ли обучать веса и смещения таким образом, у кого-нибудь есть идея о том, как я могу получить веса и смещения для каждого ярлыка, чтобы классифицировать приложение?

1 Ответ

0 голосов
/ 28 апреля 2018

для логистической регрессии с несколькими классами, вы в основном решаете это уравнение Y = WX + B и вы хотите увеличить prob(Y=l | x=x) для каждого label=l

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

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

Вы можете найти больше информации здесь

с полным кодом, я мог бы дать больше помощи

...