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.
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.
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
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)
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()
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())
#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)
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!")
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.
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.
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.
Merci à tous ceux qui ont vu jusqu'ici. Je suis encore immature, je vais donc continuer à travailler plus dur.
Recommended Posts