[PYTHON] J'ai fréquenté l'école et j'ai participé pour la première fois au concours limité BEGINNER de SIGNATE.

En premier

J'ai écrit cet article parce que je pensais que publier ce code inachevé attirerait l'attention de nombreuses personnes et me donnerait des améliorations et des remèdes tels que ce que j'ai fait de mal et ce que j'aurais dû faire. Donc, honnêtement, je pense qu'il y a beaucoup de questions telles que pourquoi vous faites cela, mais je serais heureux si vous pouviez le voir avec un œil chaleureux.

Auto-introduction et compétition

Cette fois, j'ai participé au concours organisé à partir du 1er octobre. https://signate.jp/competitions/295

Pour me présenter brièvement, j'ai commencé à fréquenter une école de programmation d'IA en avril de cette année. Je suis actuellement en train de changer d'emploi, je n'ai aucune expérience en programmation et je suis de la Faculté des arts.

Tout d'abord, j'ai participé cette fois un peu tard et j'ai commencé lentement à partir du 13 octobre. Pendant la première semaine, j'ai juste regardé les données et écrit le code en référence à ce que j'ai appris à faire. Cependant, je n'ai même pas pu soumettre à cause d'erreurs répétées ...

Puis, une semaine avant la fin de la compétition, j'ai enfin obtenu le Kaggle Start Book et j'ai décidé de le copier et de faire quelque chose comme ça. En ce qui concerne EDA, SIGNATE a publié QUEST gratuitement, alors j'y ai fait référence.

Bibliothèque utilisée cette fois

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
import optuna
import optuna.integration.lightgbm as lgb 
from sklearn.model_selection import  train_test_split
from sklearn.metrics import log_loss

Extraction de caractéristiques

Pour le moment, importez les données et regardez le contenu. (L'environnement de développement a utilisé le cahier de Kaggle)

train = pd.read_csv("../input/signatecomp/train.csv",header=0)
test = pd.read_csv("../input/signatecomp/test.csv",header=0)

print(train.info())
print(train.head())
print(train.info())
print(train.head())

Regardons les caractéristiques des données d'ici. Regardez d'abord les variables numériques.

test.hist(figsize=(20,20), color='r')

Ensuite, regardons les variables catégorielles.

emplength_var = train['employment_length'].value_counts()

#Spécifiez le titre du graphique
emplength_var.plot.bar(title="employment_fréquence de longueur")

#Spécifiez le nom de l'axe x
plt.xlabel('employment_length')

#Spécifiez le nom de l'axe y
plt.ylabel('count')

#Code requis pour afficher le graphique créé
plt.show()

#Visualisation du graphique à barres de l'objectif
purpose_var = train['purpose'].value_counts() 
purpose_var.plot.bar()

#Affichage du graphique à barres de l'objectif
plt.show()

# application_Visualisation de type graphique à barres
application_var = train['application_type'].value_counts() 
application_var.plot.bar()

# application_Affichage du graphique à barres de type
plt.show()

#Visualisation du graphique à barres de qualité
grade_var = train['grade'].value_counts()
grade_var.value_counts() 

#Affichage du graphique à barres des notes
plt.show()

Examinons ensuite la relation entre la variable objectif et la variable catégorielle.

#Index (ligne) terme colonne, prêt_Tableau croisé avec la colonne d'état en tant que colonne
cross_term = pd.crosstab(train['term'],train['loan_status'], margins = True)

#Divisez la colonne ChargedOff par la colonne Tous et divisez la variable c_Remplacer le taux
c_rate = cross_term['ChargedOff'] / cross_term['All']

#Divisez la colonne FullyPaid par la colonne All et la variable f_Remplacer le taux
f_rate = cross_term['FullyPaid'] / cross_term['All']

#Variable c_taux et variable f_taux comme croix variable_Nouvelle colonne c en terme_rate、f_Remplacer comme taux respectivement
cross_term['c_rate'] = c_rate
cross_term['f_rate'] = f_rate
#Affichage du tableau croisé
print(cross_term)

#Divisez la colonne ChargedOff par la colonne Tous et divisez la variable c_Remplacer le taux
c_rate = cross_term['ChargedOff'] / cross_term['All']

#Divisez la colonne FullyPaid par la colonne All et la variable f_Remplacer le taux
f_rate = cross_term['FullyPaid'] / cross_term['All']

#Variable c_taux et variable f_taux comme croix variable_Nouvelle colonne c en terme_rate、f_Remplacer comme taux respectivement
cross_term['c_rate'] = c_rate
cross_term['f_rate'] = f_rate

#Croix variable_Supprimer la ligne Tout du terme et la croix variable_Réaffecter au terme
cross_term = cross_term.drop(index = ["All"])

#Afficher la tabulation croisée
print(cross_term)
#Créez un DataFrame uniquement pour les colonnes que vous souhaitez utiliser pour le graphique à barres empilées
df_bar = cross_term[['c_rate', 'f_rate']]

#Créer un graphique à barres empilées
df_bar.plot.bar(stacked=True)

#Paramètres du titre du graphique
plt.title('Taux de créances douteuses et taux de remboursement pour chaque période de remboursement')

#paramètres d'étiquette de l'axe des x
plt.xlabel('période')
#paramètre d'étiquette de l'axe y
plt.ylabel('Pourcentage')

#Afficher le graphique
plt.show()

Appliquer ce travail à toutes les variables catégorielles (C'est correct de mettre tout le code, mais je suis désolé car c'est presque le même travail, mais je vais l'omettre)

Ajout de fonctionnalités

Pour le moment, j'ai pris la moyenne et j'ai converti le credit_score de manière logique car il était biaisé.

#Ajout de fonctionnalités
train["log_cre"] = np.log(train.credit_score - train.credit_score.min() + 1)
test["log_cre"] = np.log(test.credit_score - test.credit_score.min() + 1)
train['loam_median'] = train['loan_amnt'] - train['loan_amnt'].median()
train['inter_median'] = train['interest_rate'] - train['interest_rate'].median()
test['loam_median'] = test['loan_amnt'] - test['loan_amnt'].median()
test['inter_median'] = test['interest_rate'] - test['interest_rate'].median()

Prétraitement des données

Cette fois, j'ai fait l'encodage d'étiquettes.

#Convertir les données du train

Label_Enc_list = ['term','grade','purpose','application_type',"employment_length","loan_status"]

#Implémentation de l'encodage d'étiquettes
import category_encoders as ce

ce_oe = ce.OrdinalEncoder(cols=Label_Enc_list,handle_unknown='impute')
#Convertir les caractères en ordinal
train = ce_oe.fit_transform(train)
#Changer la valeur du début de 1 au début de 0
for i in Label_Enc_list:
    train[i] = train[i] - 1

#Convertir les données de test
from sklearn.preprocessing import LabelEncoder

category = test.select_dtypes(include='object')

for col in list(category):
  le = LabelEncoder()
  le.fit(test[col])
  le.transform(test[col])
  test[col] = le.transform(test[col])

print(train.head())
print(test.head())

La modélisation

#Obtenez les valeurs des variables objectives et explicatives du train
target = train['loan_status'].values
features = train.drop(['id','loan_status'],axis=1).values

#données de test
test_X = test.drop(['id'],axis=1).values

#Divisez le train en données d'entraînement et données de vérification
(features , val_X , target , val_y) = train_test_split(features, target , test_size = 0.2)

    

def objective(trial):
    lgb_params = {'objective': 'binary',
                  'max_bin': trial.suggest_int("max_bin", 255, 500), 
                  "learning_rate": 0.05,
                  "num_leaves": trial.suggest_int("num_leaves", 32, 128)
                 }
    lgb_train = lgb.Dataset(features, target) #Pour apprendre
    
    lgb_eval = lgb.Dataset(val_X, val_y,reference=lgb_train) #Pour booster
    
     #Apprentissage
    model = lgb.train(lgb_params, lgb_train,
                      valid_sets=[lgb_train,lgb_eval],
                      num_boost_round=1000,
                      early_stopping_rounds=10,
                      verbose_eval=10)
    
    y_pred = model.predict(val_X,
                           num_iteration=model.best_iteration) 
    score = log_loss(val_y,y_pred)
    return score
study = optuna.create_study(sampler=optuna.samplers.RandomSampler(seed=0))
study.optimize(objective, n_trials=20)
study.best_params
lgb_params = {'boosting_type': 'gbdt',
              'objective': 'binary',
                  'max_bin': study.best_params["max_bin"], 
                  "learning_rate": 0.05,
                  "num_leaves": study.best_params["num_leaves"]
                 }
lgb_train = lgb.Dataset(features, target) #Pour apprendre
    
lgb_eval = lgb.Dataset(val_X, val_y,reference=lgb_train) #Pour booster

#Apprentissage
model = lgb.train(lgb_params, lgb_train, valid_sets=[lgb_train,lgb_eval],
                  num_boost_round=1000,
                  early_stopping_rounds=10,
                  verbose_eval=10)


pred = model.predict(test_X,num_iteration=model.best_iteration) 

Soumission de fichier

Dans le livre de départ, j'avais l'habitude de classer par binaire à condition qu'il soit supérieur à 0,5, mais j'ai changé la condition car j'ai obtenu un score lorsque j'ai affiché environ 50 lignes et spécifié qu'il était supérieur à 0,1, mais je ne sais pas comment le gérer. C'était ... J'avais l'intention de refaire une affectation, mais je ne savais pas comment la spécifier, donc je fais la stupide chose d'ajouter une ligne une fois, d'ouvrir le fichier csv et de le supprimer (; _;) (Dois-je avoir spécifié la colonne normalement avec Header = 0?)

pred1 = (pred > 0.1).astype(int)
submit = pd.read_csv("../input/signatecomp/submit.csv")
#Sortie du fichier de résultats de prédiction
submit.loc[:,0] = pred1[1:]
submit.to_csv("submit1.csv", index = False)
print("Your submission was successfully saved!")

résultat

J'ai été promu si F1Score = 0,355 était dépassé, mais je n'ai pas pu être promu car il était de 0,3275218.

Réflexions

Premièrement, je perdais beaucoup de temps parce que j'essayais d'analyser les données sur une base quasi nulle.

Ensuite, j'ai appris une certaine quantité de connaissances et de mise en œuvre parce que j'ai appris à l'école de programmation pour la qualification E, mais j'étais désolé d'avoir négligé de résoudre le problème et de le revoir. Le résultat était

Enfin, j'étais très mauvais pour trouver des concours similaires dans Kaggle, comment implémenter du code, comment faire de l'ingénierie de données, etc.

Apprendre

Lorsque je suis entré au concours pour la première fois, j'ai eu beaucoup de choses comme ma faiblesse, ce que je devrais faire à partir de maintenant, comment gérer les erreurs, etc.

finalement

Merci à tous ceux qui ont vu jusqu'ici. Je suis encore immature, je vais donc continuer à travailler plus dur.

Recommended Posts

J'ai fréquenté l'école et j'ai participé pour la première fois au concours limité BEGINNER de SIGNATE.
MongoDB avec Python pour la première fois
Code dont j'aurais aimé me souvenir lors de ma première participation à AtCoder (Réflexion 1 pour la prochaine fois)
Pour la première fois dans Numpy, je vais le mettre à jour de temps en temps
J'ai essayé la programmation python pour la première fois.
J'ai essayé Mind Meld pour la première fois
Retour sur le concours d'apprentissage automatique sur lequel j'ai travaillé pour la première fois
Jusqu'à ce que vous gagniez la médaille d'argent (top 3%) dans le concours auquel vous avez participé dans un délai d'un mois pour la première fois en science des données!
Ce que je suis entré dans Python pour la première fois
J'ai essayé Python sur Mac pour la première fois.
Enregistrer une tâche dans cron pour la première fois
J'ai essayé python pour la première fois avec heroku
AI Gaming Je l'ai essayé pour la première fois
Premier Kaggle (kaggle ①)
Kaguru pour la première fois
Résumé des points d'achoppement à Django pour la première fois
J'ai essayé l'API Google Cloud Vision pour la première fois
SIGNATE [1st _Beginner Limited Competition] Participation au ciblage des clients de la banque
J'ai participé au tour de qualification ISUCON10!
Voir python pour la première fois
Démarrez Django pour la première fois
J'ai participé à la compétition NFL de Kaggle
Ce que j'ai appris en écrivant une Pull Request Python pour la première fois de ma vie
Une note utile lors de l'utilisation de Python après une longue période
Essayons Linux pour la première fois
GTUG Girls + PyLadiesTokyo Meetup Je suis allé au premier machine learning
Comment utiliser MkDocs pour la première fois
Signate_ Revue du 1er Concours Limité Débutant
Essayez de publier sur Qiita pour la première fois
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Essayez d'installer Arch Linux pour le moment.
J'ai participé à une programmation compétitive une semaine après avoir commencé la programmation
Participé à la première ISUCON avec l'équipe "Ranchu" # ISUCON10 Qualifying