Résumé du projet de tableau de bord

1. But de l'analyse

Le pointage de crédit Une carte est faite pour juger si l'utilisateur par défaut.

Deuxièmement, le traitement des données

Cette étape implique non seulement un traitement conventionnel tel que la modification du nom de colonne, la déduplication, les valeurs manquantes et les valeurs aberrantes, mais également le regroupement WOE.

2.1, traitement normatif du format de nom de colonne

Modifiez certains noms de colonne, tels que «NumberOfTime60-89DaysPastDueNotWorse» et «NumberOfTime30-59DaysPastDueNotWorse» dans les données. En raison de certains algorithmes ou méthodes, certains symboles dans les noms de colonne peuvent provoquer des problèmes ou même des erreurs. Par exemple, le signe "-" sera considéré comme un signe moins dans la formule de régression, il est donc remplacé par "_".

train_data.columns=train_data.columns.map(lambda x:x.replace('-','_'))

2.2, traitement répété des données

Supprimez les données en double. Des données en double peuvent facilement conduire à une réduction de l'erreur standard du coefficient de régression, ce qui réduit la valeur p correspondante.

train_data.drop_duplicates(inplace=True)

2.3 Traitement des valeurs manquantes

2.3.1. Afficher la distribution des valeurs manquantes

Nous utilisons la méthode matrix () de la bibliothèque missingno pour afficher les valeurs manquantes de chaque entité.

import missingno as msno
msno.matrix(train_data)
plt.show()

Insérez la description de l'image iciD'après le graphique ci-dessus, il manque des valeurs dans les deux colonnes «Revenus mensuels» et «Nombre de personnes à charge», les premières représentant plus de 80% et les secondes moins.

2.3.2, logique de traitement des valeurs manquantes

1. La méthode conventionnelle de traitement des valeurs manquantes consiste à supprimer directement les données contenant plus de 80% des valeurs manquantes. Pour les cartes de pointage de crédit, étant donné que toutes les variables doivent être regroupées, les valeurs manquantes peuvent être utilisées ici dans des cases distinctes.
2. Pour la dernière colonne de «NumberOfDependents», la proportion de valeurs manquantes n'est que de 2,56%. Dans une seule case, les informations ne sont pas suffisantes, donc une seule valeur est remplie. Utilisez la médiane pour remplir.

2.3.2 Une valeur unique remplace la valeur manquante

Remplacez la valeur manquante de la dernière colonne «NumberOfDependents» par la médiane.

NOD_median=train_data['NumberOfDependents'].median()
train_data['NumberOfDependents'].fillna(NOD_median,inplace=True)

2.4 Traitement aberrant

Les méthodes de traitement courantes pour les valeurs aberrantes incluent la suppression de la ligne où elles se trouvent, le remplacement par des valeurs manquantes (pour traiter les valeurs manquantes) ou la méthode de blocage. Combinez les exigences de la logique métier et de l'algorithme pour déterminer si et comment traiter les valeurs aberrantes.En général, la méthode de blocage peut être utilisée, c'est-à-dire que les valeurs extrêmes extrêmes sont remplacées par des valeurs extrêmes moins anormales. Il peut également être omis. Nous définissons d'abord la fonction de la méthode de blocage et l'utilisons en cas de besoin.

def block(x,lower=True,upper=True):
# x是输入的Series对象,lower表示是否替换1%分位数,upper表示是否替换99%分位数
    ql=x.quantile(0.01)
    qu=x.quantile(0.99)
    if lower:
        out=x.mask(x<ql,ql)
    if upper:
        out=x.mask(x>qu,qu)
    return out

2.4, fonction personnalisée, résume le processus de nettoyage des données

Nous définissons d'abord une fonction pour encapsuler le processus de nettoyage des données. Cette fonction peut être utilisée pour synchroniser le nettoyage des données lors de la prévision de nouvelles données ultérieurement.

def datacleaning(testdata,include_y=False):
    testdata.columns=testdata.columns.map(lambda x:x.replace('-','_'))
    testdata['NumberOfDependents'].fillna(NOD_median,inplace=True)      #新数据的缺失值需要用训练集的填充方式处理
    if include_y:
        testdata["SeriousDlqin2yrs"]=1-testdata.SeriousDlqin2yrs  #好客户用1表示,坏客户用0表示,便于混淆矩阵指标分析提取
    return testdata

3. Sélection des fonctionnalités

Tout d'abord, nous personnalisons un fichier externe smob.py, qui encapsule la sélection des fonctions d'entité à travers des arbres de décision, la génération de WOE et le calcul des fonctions de valeur IV et les fonctions d'index d'évaluation du modèle de calcul.
Remarque: Les fonctions impliquées sont répertoriées dans le code complet à la fin de l'article.

3.1 Générer des objets de regroupement pour chaque X

Utilisons d'abord la fonctionnalité "RevolvingUtilizationOfUnsecuredLines" comme explication. Les autres fonctionnalités sont les mêmes.
1. Initialisez d'abord les données

y='SeriousDlqin2yrs' #初始化一个标签名变量
iv_all=pd.Series()   #初始化一个空序列变量,用于存放各特征IV值

2. Appelez la fonction smbin pour trouver les données de malheur et la valeur IV de la fonction.

RUO=smbin(train_data,y,'RevolvingUtilizationOfUnsecuredLines')

Insérez la description de l'image ici

3.2, afficher toutes les valeurs IV caractéristiques

La valeur IV est l'un des indicateurs utilisés pour filtrer les caractéristiques importantes. Selon la valeur IV, les fonctionnalités inférieures à 0,02 sont supprimées. En général, IV <0,02, presque aucune aide pour la prédiction; 0,02≤IV <0,1, a une certaine aide; 0,1≤IV <0,3, a une grande aide pour la prédiction; IV≥0,3, a une grande aide.

iv_all.sort_values(ascending=False)

Insérez la description de l'image iciD'après les résultats, ces caractéristiques sont plus ou moins importantes. Ensuite, nous modélisons préalablement pour voir l'effet.

3.3, générer des données WOE

Le principe du binning: le nombre de binning est modéré, ni trop ni trop peu; le nombre d'enregistrements dans chaque binning est raisonnable; le binning doit refléter les caractéristiques de tendance évidentes; la différence entre les binning adjacents ne doit pas être trop importante. Nous avons choisi la méthode de binning supervisé et l'algorithme a choisi l'arbre CART.
1. Initialiser la liste
Les objets obtenus par smbin et smbin_cu avant sont filtrés selon la valeur IV et placés dans une liste.

x_list = [RUO,age,NO3059,DebtRatio,MonthlyIncome,NOO,NO90,NRE,NO6089,NOD]

2. Générer des données WOE
Utilisez la fonction smgen pour générer de nouvelles données basées sur la liste obtenue

data_woe=smgen(train_data,x_list)
data_woe.head()

Insérez la description de l'image ici

Quatrièmement, la modélisation

4.1, modélisation préliminaire

Établissez un modèle de régression logistique, ajustez les données et affichez les résultats de la régression.

glmodel=sm.GLM(Y_train,X_train,family=sm.families.Binomial()).fit()
glmodel.summary()    
#可以查看系数(coef)、系数标准误(std err)
#P>|z|,就是P检验,小于0.05说明显著,说明变量是重要变量

Insérez la description de l'image ici
D'après les résultats renvoyés par le modèle, la valeur IV peut nous aider à filtrer les caractéristiques importantes, mais ce n'est pas une méthode précise. Il semble que la valeur IV élevée dans les données ne soit pas nécessairement une caractéristique importante. Ensuite, nous devons effectuer des tests d'hypothèse, et nous choisissons le test P (moins de 0,05 est la caractéristique importante). Nous avons constaté que la fonctionnalité «NumberOfOpenCreditLinesAndLoans_woe» a une valeur P supérieure à 0,05, nous avons donc choisi de supprimer la fonctionnalité.

4.2, afficher la colinéarité

Calculez la valeur vif de chaque variable prédictive pour voir s'il existe une colinéarité entre les variables. Plus la valeur VIF est élevée, plus l'erreur standard du coefficient sera grande et l'intervalle de confiance sera particulièrement petit. Lorsque le VIF est compris entre [1,3), la variable peut être utilisée directement; entre [3,7), les données doivent être traitées un peu avant de pouvoir être utilisées; entre [7,10), les données doivent être traitées avant de pouvoir être utilisées; supérieur à 10, la colinéarité se produit Phénomène, les variables doivent être modifiées.

vif=[variance_inflation_factor(X_train.iloc[:,1:].values,i
                              ) for i in range(X_train.shape[1]-1)]
print(pd.Series(dict(zip(X_train.columns[1:],vif))))

Insérez la description de l'image iciLes résultats montrent qu'il n'y a pas de phénomène colinéaire parmi les variables. Ensuite, faites une carte de score.

Générer une carte de score

5.1 Principe de génération du modèle de pointage de crédit

1. Pour un score spécifique, les bons clients et les mauvais clients ont une certaine relation proportionnelle, c'est-à-dire cotes (cotes), cotes = xPctGood / xPctBad.
2. Le rapport de cotes double lorsque vous augmentez une certaine valeur de score, par exemple, 45 points, les cotes doublent (de 50: 1 à 100: 1)
3. Formule (5.1): Score = Offset + Factor × ln (cotes); Formule (5.2): Score + pdo = Offset + Facteur × ln (2 × cotes)
4. Pour le moment, nous devons utiliser la fonction personnalisée smscale (modèle, liste des fonctionnalités, pdo, score, cotes). La plage de valeurs combine les deux formules ci-dessus pour ajuster les valeurs des trois paramètres pdo, score et cotes.
La plage d'amélioration commerciale est ici [300, 843], et enfin nous obtenons les valeurs des paramètres: pdo = 43, score = 1151, cotes = 10.

5.2 Calculer le score de chaque catégorie

Le côté gauche de l'équation de régression obtenue par régression logistique logistique est substitué dans la formule de score de crédit (5.1) à l'étape précédente.
Insérez la description de l'image iciNotre fonction personnalisée ScoreCard enregistre les résultats des scores de chaque catégorie, et scorecard.ScoreCard peut obtenir les données.

Insérez la description de l'image ici

6. Modèle d'évaluation

Nous évaluons en traçant une courbe KS.
1. Selon l'objet du tableau de bord précédent, obtenez le score de l'ensemble de tests.

testscore=smscoregen(scorecard,X_test)

2. Tracez la courbe ks en passant par le vrai y dans l'ensemble de test et le score prédit, en même temps obtenez le seuil optimal correspondant et les mesures associées.

evaluate1=evaluate01(Y_test,testscore['Score'],index='ks',plot='ks')

Insérez la description de l'image ici

Sept, nouvelle prédiction de données

1. Lisez d'abord les données.

test_data=pd.read_csv('data/CreditScore_data/give-me-some-credit-dataset/cs-test.csv',index_col=0)

2. Effectuez le même nettoyage des données que les données d'entraînement, c'est-à-dire utilisez la fonction de nettoyage définie précédemment.

test0=datacleaning(test_data)

3. Générez des données contenant des colonnes de malheurs à partir des objets de regroupement obtenus précédemment.

test_woe=smgennew(test0,x_list)
test_woe.head()

4. Extrayez les données WOE pour générer des données de prédiction et ajoutez une colonne d'élément constante.

T=test_woe.iloc[:,-len(x_list):]
T=sm.add_constant(T)

5. Prédisez le score de chaque ligne de données pour générer un score total et un score pour chaque fonctionnalité.

Tscore=smscoregen(scorecard,T)

6. Juger de la qualité des clients sur la base des scores et des seuils obtenus lors de la formation: les bons clients sont 1 et les mauvais clients 0.

test0[y]=(Tscore.Score>evaluate1.cutoff)*1
test0.head()

Insérez la description de l'image ici
Afficher la valeur AUC: evaluer 1. AUC = 0.8609421718165055. Cela montre que notre capacité de généralisation de modèle est bonne.

8. Résumé

1. L'objectif de ce projet est de regrouper et d'identifier les fonctionnalités importantes et de réduire le nettoyage des données.
2. La difficulté de ce projet est d'ajuster les paramètres. Vous devez d'abord fixer un paramètre de score, puis ajuster les deux autres paramètres pour observer la tendance de changement des données. Le paramètre de score équivaut à la ligne médiane de la balance. Les deux autres paramètres, pdo et odds, sont les poids sur les côtés gauche et droit, et les données peuvent être atteintes en ajoutant ou en soustrayant les poids gauche et droit.
3. Il convient de noter que les algorithmes de régression sont particulièrement sensibles aux valeurs répétées, aux valeurs manquantes et à la colinéarité entre les variables. Il est nécessaire de l'analyser et de le traiter avant la modélisation.
4. Un autre détail qui mérite notre attention est que nous devons diviser l'ensemble de données avant de traiter la valeur manquante, puis effectuer le traitement des données. Lors du traitement de l'ensemble d'apprentissage, les données de l'ensemble de test doivent également être traitées de manière synchrone (veillez à suivre d'abord la logique de l'ensemble d'apprentissage).

Joignez le code complet

Publié 12 articles originaux · Like9 · Visiteurs 20 000+

Je suppose que tu aimes

Origine blog.csdn.net/sun91019718/article/details/101755562
conseillé
Classement