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).
La forme de la fonction logistique est la suivante. Il prend une valeur de 0 à 1 et augmente de manière monotone.
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.)
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
{describe_affair.py}
df.head()
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>)
{easy_display1.py}
#Âge et présence d'affaire
sns.countplot('age', data = df.sort('age'), hue = 'Had_Affair', palette='coolwarm')
{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')
{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')
Le taux d'affaire est plus élevé lorsque vous vieillissez / avez plus d'années de mariage / avez des enfants
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()
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
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
{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
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.
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