[PYTHON] Retour logistique

Qu'est-ce que la régression logistique?

Similaire à la régression linéaire, mais utilisée lorsque la variable objectif est binaire. Par exemple, si cette personne achète ou non un produit, qu'elle frappe ou non un bâton, qu'elle déménage ou non, qu'elle change ou non d'emploi, etc.

Créez un modèle de prédiction à l'aide de la fonction logistique suivante (fonction sigmoïde). スクリーンショット 2016-05-03 16.47.40.png

La forme de la fonction logistique est la suivante. Il prend une valeur de 0 à 1 et augmente de manière monotone. スクリーンショット 2016-05-03 16.48.21.png

La relation entre la matrice de variable objective x et la variable explicative y est la suivante. (Le côté droit de y = ax + b est exp à la puissance -1.) スクリーンショット 2016-05-03 16.49.51.png

Préparation des données d'utilisation

Utilisez les données d'affaire avec sklearn.

{get_affair_dataset.py}


from sklearn.linear_model import LogisticRegression #Pour la régression logistique
from sklearn.cross_validation import train_test_split #Pour la séparation de la validation croisée
import statsmodels.api as sm

df = sm.datasets.fair.load_pandas().data #Chargement des données d'affaire

Résumé des données sur l'infidélité

{describe_affair.py}


df.head()
スクリーンショット 2016-05-03 16.53.17.png

rate_marriage: bonheur, age: age, yrs_married: années de mariage, enfants: nombre d'enfants, religieux: confession, educ: formation finale, profession: profession de la femme, profession_husb: profession du mari, affaires: expérience de liaison (supérieure à 0) Had_Affair: indicateur d'affaire (1 est défini si affaires est 0>)

Visualisez facilement la relation entre la présence ou l'absence d'infidélité et un échantillon approprié

{easy_display1.py}


#Âge et présence d'affaire
sns.countplot('age', data = df.sort('age'), hue = 'Had_Affair', palette='coolwarm')
スクリーンショット 2016-05-03 16.57.17.png

{easy_display2.py}


#Années de mariage et présence ou absence de liaison
sns.countplot('yrs_married', data = df.sort('yrs_married'), hue = 'Had_Affair', palette='coolwarm')
スクリーンショット 2016-05-03 16.57.21.png

{easy_display3.py}


#Nombre d'enfants et présence ou absence de liaison
sns.countplot('children', data = df.sort('children'), hue = 'Had_Affair', palette='coolwarm')
スクリーンショット 2016-05-03 16.57.35.png

Le taux d'affaire est plus élevé lorsque vous vieillissez / avez plus d'années de mariage / avez des enfants

Essayez le retour logistique

Prétraitement

Avant de faire cela, la variable d'occupation est une variable catégorielle, alors remplacez-la par une variable fictive. Une variable catégorielle est une variable dans laquelle la taille de la valeur n'a pas de sens.

{change_dummy_value.py}


#numpy obtenir_Convertir en variable factice avec des mannequins.
occ_dummies = pd.get_dummies(df.occupation)
hus_occ_dummies = pd.get_dummies(df.occupation_husb)

#Jeu de noms de colonne
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']

occ_dummies.head()
スクリーンショット 2016-05-03 17.13.59.png

Avec le sentiment ci-dessus, celui des occ1 à 6 qui est touché sera remplacé par le drapeau 0,1.

Ensuite, récupérez les variables explicatives.

{get_x.py}


#Définissez X en supprimant la profession, la profession du mari et l'état matrimonial de la base de données d'origine.
X = df.drop(['occupation', 'occupation_husb', 'Had_Affair'], axis =1) 
#Préparer une base de données dans laquelle les professions sont converties en variables fictives
dummys = pd.concat([occ_dummies, hus_occ_dummies], axis =1)
#Combiner la trame de données de variable factice d'occupation avec la trame de données avec l'occupation, etc. supprimée
X = pd.concat([X, dummys], axis=1)

X.head()

Ensemble de données pour les variables explicatives jusqu'à présent スクリーンショット 2016-05-03 17.18.57.png

Colinéarité multiple

Lorsqu'une variable explicative peut représenter une ou plusieurs autres variables explicatives, on dit qu'elle a une colinéarité multiple. Par exemple, cette fois, occ1 est uniquement déterminé par les valeurs de occ2 à occ6. (S'il y a un ou plusieurs 1 dans occ2-6, occ1 = 0, sinon occ1 = 1) Dans ce cas, la matrice inverse ne peut pas être calculée, ou même si elle peut être calculée, la fiabilité du résultat obtenu devient faible. Donc, pour éliminer cela, supprimez occ1 et hocc1.

{drop_nonavailable_value.py}


X = X.drop('hocc1', axis = 1)
X = X.drop('hocc1', axis = 1)
#Puisque les affaires sont utilisées pour créer la variable objective, celle-ci est également exclue des variables explicatives.
X = X.drop('affairs', axis =1 )

X.head()

Forme finale

スクリーンショット 2016-05-03 17.28.45.png

Courir avec sklearn

{do_logistic_regression.py}


#Jeu de variables d'objectif
Y = df.Had_Affair
Y = np.ravel(Y)    # np.Faire de Y un tableau unidimensionnel avec ravel

#Exécution de la régression logistique
log_model = LogisticRegression() #Génération d'instance
log_model.fit(X, Y)              #Exécution de la création du modèle
log_model.score(X, Y)            #Confirmation de la précision de la prédiction du modèle(72.6%)
> 0.7260446120012567

Vérifiez le coefficient de chaque variable

{confirm_coefficient.py}


#De l'instance.coef_[0]Contient le coefficient
coeff_df = DataFrame([X.columns, log_model.coef_[0]]).T
coeff_df
スクリーンショット 2016-05-03 17.36.33.png

L'endroit où ce coefficient est grand a beaucoup d'influence. Cependant, comme les unités de données des variables explicatives ne sont pas unifiées, il n'est pas possible de les comparer simplement côte à côte. Par exemple, occ5 est environ 9 fois plus grand que yrs_married, il n'est donc pas simple de dire OK !! sans regarder le nombre d'années de mariage.

Au fait

Comme d'habitude, j'écrirai comment le diviser en train et test.

{do_logistic_regression_train_test.py}


#Préparation des données pour le train et le test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y)

log_model2 = LogisticRegression() 
log_model2.fit(X_train, Y_train)           #Création de modèle avec des données de train
class_predict = log_model2.predict(X_test) #prédire les données de test

from sklearn import metrics #Pour vérifier l'exactitude des prévisions

metrics.accuracy_score(Y_test, class_predict) #Contrôle de précision
>0.73115577889447236

Vous pouvez voir que la précision est d'environ 73%.

Recommended Posts

Retour logistique
Retour logistique
Régression logistique d'apprentissage automatique
Algorithme d'apprentissage automatique (régression logistique)
Implémentation de la régression logistique avec NumPy
Retour logistique (pour les débutants) -Code Edition-
Appliquer la fonction d'influence à la régression logistique
Régression linéaire
Qu'est-ce que l'analyse de régression logistique à plusieurs termes?
Analyse de régression logistique Self-made avec python
Premier TensorFlow (édition révisée) - Régression linéaire et logistique
PRML Chapitre 4 Implémentation Python de la régression logistique bayésienne
<Subject> Machine learning Chapitre 3: Modèle de régression logistique
[Kaggle pour les super débutants] Titanic (retour logistique)
J'ai essayé d'implémenter la régression logistique de Cousera en Python
Analyse de régression de Poisson
Comprendre la régression logistique (1) _ À propos des cotes et de la transformation logistique
Essayez Theano avec les données MNIST de Kaggle ~ Retour logistique ~
Méthode d'analyse de régression
Implémenter un modèle de régression logistique en temps discret avec stan
Implémentation de la régression logistique avec la méthode d'optimisation des groupes de particules
Précautions lors de l'exécution de la régression logistique avec Statsmodels
Défis d'apprentissage automatique de Coursera en Python: ex2 (retour logistique)
Régression linéaire multiple, régression logistique, perceptron multicouche, encodeur automatique, Chainer Yo!
Résolution du problème de l'iris avec scikit-learn ver1.0 (régression logistique)