La dernière fois, j'ai résumé ce que j'avais appris de la théorie sur la régression logistique.
J'ai essayé d'approfondir ma compréhension en créant un discriminateur qui peut être classé binaire par ma propre régression logistique. https://qiita.com/Fumio-eisan/items/e2c625c4d28d74cf02f3
Cette fois, nous avons effectué une estimation du modèle à l'aide d'un ensemble de données réel. Nous avons résumé le traitement de base du prétraitement des données (variable factice, suppression de colonnes, combinaison), l'interprétation des données et la colinéarité multiple, qui est un problème en analyse multivariée. Il existe de nombreux contenus d'implémentation.
Le contour est ci-dessous.
La version utilisée est la suivante.
Cette fois, nous avons utilisé l'ensemble de données des résultats de l'enquête de 1974 sur les femmes mariées pour la présence d'infidélité.
affair.ipynb
df = sm.datasets.fair.load_pandas().data
df.head()
En regardant les données, vous pouvez voir que la période depuis le mariage, l'âge, la présence d'enfants, etc. sont décrits comme des variables explicatives. Et enfin, il y a un numéro dans la colonne des affaires. 0 indique que vous n'êtes pas une infidélité, et 1 ou plus indique que vous êtes (ou étiez) une infidélité.
Évaluez la différence entre la présence et l'absence d'infidélité. Tout d'abord, dans les données actuelles, les nombres d'affaires sont différents, donc divisez par affaire (1 ou plus) et non par affaire (0).
affair.ipynb
def affair_check(x):
if x!=0:
return 1
else:
return 0
df['Had_Affair']=df['affairs'].apply(affair_check)
Interprétez les données pour rechercher des paramètres susceptibles d'être plus pertinents pour le modèle prédictif. Pour cela, classez par affaire (1) et sans affaire (0) et faites un histogramme avec chaque variable. Avec les axes comme valeur de retour, donnez chacun comme argument dans le graphique que vous souhaitez représenter.
affair.ipynb
fig, axes = plt.subplots(nrows=3, ncols=3,figsize=(10,8))
sns.countplot(df['age'], hue=df['Had_Affair'],ax=axes[0,0])
sns.countplot(df['yrs_married'], hue=df['Had_Affair'],ax=axes[0,1])
sns.countplot(df['children'], hue=df['Had_Affair'],ax=axes[0,2])
sns.countplot(df['rate_marriage'], hue=df['Had_Affair'],ax=axes[1,0])
sns.countplot(df['religious'], hue=df['Had_Affair'],ax=axes[1,1])
sns.countplot(df['educ'], hue=df['Had_Affair'],ax=axes[1,2])
sns.countplot(df['occupation'], hue=df['Had_Affair'],ax=axes[2,0])
sns.countplot(df['occupation_husb'], hue=df['Had_Affair'],ax=axes[2,1])
Maintenant que vous pouvez tout afficher en même temps, vous pouvez maintenant interpréter les données. Fondamentalement, je pense que vous devriez vous concentrer sur les paramètres où les pics sont différents entre le groupe ** infidélité et le groupe sans affaire. ** **
Nous allons maintenant effectuer un prétraitement pour créer un modèle de prédiction. Dans cet ensemble de données sur les affaires, les variables catégorielles sont la profession et la profession du mari. Pour ceux-ci, nous introduisons des variables fictives et les classons avec une expression 0/1.
C'est une telle image. La mise en œuvre est la suivante.
affair.ipynb
occ_dummies = pd.get_dummies(df['occupation'])
hus_occ_dummies = pd.get_dummies(df['occupation_husb'])
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']
occ_dummies
J'ai pu le diviser en toute sécurité.
Ensuite, je veux supprimer les colonnes dont je n'ai pas besoin et connecter les colonnes dont j'ai besoin. Supprimez les colonnes occupation et Had_Affair.
affair.ipynb
X = df.drop(['occupation','occupation_husb','Had_Affair'],axis=1)
Ensuite, rassemblez les variables factices.
affair.ipynb
dummies = pd.concat([occ_dummies,hus_occ_dummies],axis=1)
Enfin, combinez la variable factice avec les données d'origine.
affair.ipynb
XX = pd.concat([X,dummies],axis= 1)
Ensuite, considérons la colinéarité multiple. C'est un problème qui apparaît à mesure que les types de variables explicatives augmentent. Parmi ces variables explicatives, le phénomène dans lequel les coefficients de corrélation sont forts entre eux est appelé ** co-linéarité multiple **. S'il y a beaucoup de colinéarité multiple, la précision de l'équation de régression peut devenir extrêmement médiocre et les résultats de l'analyse peuvent devenir instables.
Par exemple, dans un modèle qui prédit les prix des logements, le «nombre de pièces» et la «superficie de la pièce» devraient avoir une forte corrélation. Dans de tels cas, vous pouvez éviter la colinéarité multiple en excluant l'une des variables.
Cette fois, j'aimerais faire un modèle en excluant occ1, hocc1 = étudiants de la variable fictive profession.
affair.ipynb
XX = XX.drop('occ1',axis=1)
XX = XX.drop('hocc1',axis=1)
La relation est comme indiqué ci-dessus.
Puis prédisez le modèle. Cette fois, je voudrais faire une prédiction simple en utilisant la régression logistique de scicit learn. Entraînez d'abord le modèle avec uniquement les données d'entraînement. Puis prédisez avec les données de test.
affair.ipynb
X_train, X_test, Y_train, Y_test = train_test_split(XX, Y)
model2 = LogisticRegression()
model2.fit(X_train, Y_train)
class_predict = model2.predict(X_test)
print(metrics.accuracy_score(Y_test,class_predict))
0.707286432160804
Il s'est avéré que le taux de réponse correcte était d'environ 70%. Alors, que se passe-t-il si les données effacées en évitant la colinéarité multiple mentionnée précédemment ne sont pas effacées telles quelles (= le fait est que les données sont telles quelles)?
affair.ipynb
X2_train, X2_test, Y2_train, Y2_test = train_test_split(X2, Y)
model3 = LogisticRegression()
model3.fit(X2_train, Y2_train)
class_predict2 = model3.predict(X2_test)
print(metrics.accuracy_score(Y2_test,class_predict2))
0.9748743718592965
Le taux de réponse correcte était élevé à 97%. ** Dans ce cas, la colinéarité multiple ne se produit pas, donc on peut voir que les données auraient dû être laissées telles quelles. ** **
En d'autres termes, il semble que la prise en compte ou non de la colinéarité multiple doit être envisagée une fois lorsque toutes les données sont incluses dans le calcul et lorsqu'elles sont supprimées. Il s'est avéré que la partie empirique est la procédure de dire des choses.
Les données ont été interprétées à l'aide de pandas et de matplotlib, et le prétraitement a été effectué en tenant compte de la colinéarité multiple. Puisqu'il s'agit d'un ensemble de données de type tutoriel, il semble avoir progressé sans heurts, mais je pensais que la gestion des pandas tels que le dessin et la combinaison de graphiques était encore plus. De plus, comme la mise en œuvre de la régression logistique elle-même est très simple, il était très pratique de pouvoir calculer sans savoir ce qui se passait à l'intérieur.
Le programme complet peut être trouvé ici. https://github.com/Fumio-eisan/affairs_20200412
Recommended Posts