Bu makale, Veri Bilimi Blogathon.
NLP kullanarak Tüketici Şikayetlerini Ayrıştırma hakkında uçtan uca Kılavuz
Hey millet!
Bu yazıda, NLP'nin temel kavramlarını kullanarak çok detaylı bir şekilde Tüketici Şikayet Ayrımı olan gerçek bir İş Problemini çözeceğiz.
Özellik çıkarma, ham verilerle çalışma ve metinsel veriler üzerinde model eğitimi gibi doğal dil işleme temelleri kavramları konusunda zaten rahat olduğunuza inanıyorum.
NLP hakkında sıfırdan başlayarak bir dizi ayrıntılı makale yazdım, bu nedenle NLP'nin temelleri konusunda rahat değilseniz makalelerime başvurabilirsiniz.
İçerik Tablosu
- Giriş ve Hedef
- verileri yükleme
- Özellik Mühendisliği ve Özellik Çıkarma
- Keşifsel Veri Analizi (EDA)
- Metin Ön İşleme
- Çoklu Sınıflandırma Modelinin Eğitimi
- Geri Çağırma, Hassasiyet, F1-skoru
- Tahminler
Giriş
Finansal Koruma Bürosu, bazı yanıtlar için binlerce tüketicinin finansal hizmetler (ipotek, öğrenci kredileri vb.) ve ürünler (yani kredi kartları, banka kartları) hakkındaki şikayetlerini gönderen bir kuruluştur.
Şikayetlerin ayrıştırılması ve ilgili departmana iletilmesi gerekiyor, bu da şikayet kategorisini sınıflandırmak için insan müdahalesini azalttığımız için şikayetlerin yanıt süresini artırıyor.
Bu nedenle, ipotekle ilgili şikayetlerin ipotek departmanına iletilmesi gerektiği ve kredi kartı şikayetlerinin bankacılık ürünleri departmanına iletilmesi gerektiği gibi şikayeti okuyan ve ilgili departmana söyleyebilecek bir model oluşturmamız gerekiyor.
Gol
Bu Projenin Amacı, şikayeti ilgili ürün veya kategori departmanlarına ayırmaktır.
Şikayet ikiden fazla olabileceğinden çok sınıflı bir sınıflandırma olacaktır ve NLP ve makine öğrenmesi algoritmaları kullanılarak çözülebilir.
Makine öğrenimi modelini kullanarak şikayeti kolayca sınıflandırabiliyoruz, bu nedenle şikayeti sınıflandırmak için insan müdahalesini azaltıyor ve şikayetlerin yanıt süresini kısaltıyoruz.
Not: Eğitim ve test amacıyla etiketlenmiş veriler üzerinde çalıştığımız için metin sınıflandırması denetimli makine öğrenimine bir örnektir.
Bu Proje üzerinde çalışmaya başlayalım.
1. Veri Kümesini Yükleme ve Anlama
Tüketici Mali Koruma Bürosu tarafından sağlanan Tüketici Finansmanı Şikayetleri Veri Kümesi üzerinde çalışacağız.
Bunu kullanarak veri setini indirebilirsiniz. Link veya bir bulut Not Defteri oluşturup anında çalışabilirsiniz.
- Veri kümesini Pandas veri çerçevesine yükleme
pandaları pd olarak içe aktar numpy'yi np olarak içe aktar df = pd.read_csv("../input/consumer-complaint-database/rows.csv", low_memory = False) df.head()
Bu veri kümesi çok sayıda sütun içeriyor ancak yalnızca iki sütuna [Ürün, Tüketici şikayeti anlatımı] odaklanmamız gerekiyor.
Product
→ Şikayet KategorisiConsumer complaint narrative
→ Tüketici Şikayet metni
df1 = df[['Ürün', 'Tüketici şikayeti anlatımı']] df1.columns = ['Ürün', 'Tüketici şikayeti']
adını değiştirdik”consumer complaint narrative
"Kime"Consumer complaint
” ve bir veri çerçevesinde tutulur df1
.
- Yazısız Şikayetleri Filtreleme (Yanlış Şikayet)
Veri setinde metin gövdesi olmayan birçok şikayet var, bunlar yanlış şikayetlerdir, bu tür şikayetleri filtrelememiz gerekir.
df1 = df1[df1['Tüketici şikayeti'].isna() != Doğru]
2. Özellik Mühendisliği
Özellik Mühendisliği altında, modeli verimli bir şekilde eğitmek ve verilere daha iyi bir bakış açısı elde etmek için bazı veri manipülasyonları yapıyoruz.
pd.DataFrame(df1.Product.unique()).değerler
Veri setimizde 18 farklı şikayet kategorimiz var, şikayet kategorilerinden bazıları birbiriyle ilişkili. örneğin “Ön ödemeli kartın kredi kartı” ile “Ön Ödemeli Kart”, “Kredi kartı” birbiriyle ilişkilidir.
Bu nedenle, ilgili kategorileri birleştirmek için kategorileri yeniden adlandırmamız gerekiyor.
- Kategorileri Yeniden Adlandırma
# df1.replace({'Ürün': { 'Kredi raporlama': 'Onarım veya Kredi raporlama', 'Kredi kartı': 'Kredi kartı veya ön ödemeli kart', 'Ön ödemeli kart': 'Kredi kartı veya ön ödemeli kart', 'kredi onarım hizmetleri,Kredi raporlama veya diğer kişisel tüketici raporları': 'Onarım veya Kredi raporlama', 'Para transferi': 'Para transferi, sanal para birimi veya para hizmeti', 'Ödeme günü kredisi': 'kredi kredisi' ,Payday ,Kişisel kredi', 'Sanal para birimi': 'Para transferi, sanal para birimi veya para hizmeti'}}, yerinde= Doğru)
Yeniden adlandırdıktan sonra, sınıflandırmak için yalnızca 13 kategorimiz / Ürünümüz var.
Not: Üzerinde çalıştığımız Veri Kümesi çok büyük. 1.2 milyon satır içerir, bu nedenle büyük bir veri üzerinde eğitim çok zaman alacaktır, bu nedenle zamandan tasarruf etmek için eğitimimiz için yalnızca 10000 satırlık bir örnek alacağız.
df2 = df1.örnek(10000, rastgele_durum=1).kopya()
burada df2, üzerinde daha fazla çalışacağımız veri kümesidir ve 10000 satır ve 2 sütun içerir
- Şimdiye kadar metinde veri setimiz var ve şikayet metnini ve kategoriyi bir sayıya dönüştürmemiz gerekiyor
Kategorileri Dönüştürme (Product
) sayılara
df2['category_id'] = df2['Ürün'].factorize()[0]
Yeni bir sütun ekledik”category_id
” ve kategori numarasını içerecektir.
- Gördüğünüz gibi, kategori etiketini kategori_id'ye dönüştürdük, ayrıca kategori_kimliğini tahmin anında kategori etiketine geri dönüştürmek için verilere ihtiyacımız var. Bu amaçla bir sözlük oluşturacağız.
kategori_kimliği = df2[['Ürün', 'kategori_kimliği']].drop_duplicates() id_2_category = dict(category_id[['category_id', 'Ürün']].değerler)
kullanacağız id_2_category
class_id'yi class_lable'a dönüştürmek için sözlük.
3. EDA'nın Gerçekleştirilmesi
EDA kapsamında verilerimizi keşfediyor, verilerin ilişkisini ve çeşitli içgörülerini anlamak için grafikler çiziyoruz.
Ürün/Kategori ve Şikayet Sayısının Grafiklendirilmesi
matplotlib.pyplot'u plt olarak içe aktarın seaborn'u sns olarak içe aktar fig = plt.figure(figsize=(8,6)) renkler = ['gri','gri','gri','gri','gri','gri' ,'gri','gri','gri', 'gri','koyu mavi','koyu mavi','koyu mavi'] df2.groupby('Ürün')['Tüketici şikayeti'].count().sort_values( ).plot.barh( ylim=0, color=colors, title= 'HER ÜRÜN KATEGORİSİNDEKİ ŞİKAYET SAYISIn') plt.xlabel('Yinelenme sayısı', yazı tipi boyutu = 10)
“Kredi raporlaması, onarım ve diğer” en fazla destekleyici kayıtlara sahip olduğunu ve “Diğer finansal Hizmetler”in çok az kaydı olduğunu muhtemelen görebilirsiniz. Bu, bazı Olası veri dengesizliklerini gösterir ve bu, her kategoriden/Üründen eşit kayıtlar örneklenerek düzeltilebilir.
4. Özellik Mühendisliği
Şimdi Şikayet metnini bazı vektörlere dönüştürmemiz gerekiyor çünkü makine metinsel verileri anlayamıyor. Bu işleme Özellik Çıkarma denir.
Kullanacağız tf-idf Vectorizer
(Ters Belge Frekansı) özellik çıkarımı için. Özellik Mühendisliği konusunda rahat değilseniz, makalemi tercih edin.
TFIDF, bir belgenin bir koleksiyon veya belge grubundaki belgesi için ne kadar önemli olduğunu değerlendirdi.
Not: Noktalama işaretlerini kaldırdıktan sonra kelimeleri küçük harf yaparak özellik çıkarma adımına geçebiliriz. TFIDF vectorizer, stopwords'ü kendi başına işleyebilir.
Dönem Frekansı: Bu, belirli bir kelimenin bir belgede ne sıklıkta geçtiğini söyler.
Ters Belge Frekansı: Terim Frekansının tersidir. Belirli bir kelime belgeler arasında birçok kez görünüyorsa, IDF puanı düşük olacaktır.
sklearn.feature_extraction.text'ten içe aktarma TfidfVectorizer tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, ngram_range=(1, 2), stop_words='english')
# Vektörleştirme özellikleri = tfidf.fit_transform(df2['Tüketici şikayeti']).toarray() etiketleri = df2.category_id
min_df
: ' den daha az görünen bu kelimeleri kelime dağarcığından kaldırır.min_df
'Dosya sayısı.sublinear_tf = True
Frekans terimini logaritmik bir ölçekte ölçeklendirin.stop_words
: bahsi geçen dilin stopwords'lerini kaldırır.ngram_range =(1, 2)
Unigram ve bigram her ikisi de dikkate alınacaktırmax_df
: ' den daha fazla ortaya çıkan kelimeleri kelime dağarcığından kaldırır.maxdf
'
Veri Kümesini Bölme
Veri kümesini eğitim ve test bölümlerine bölme. Kayıtların %75'i eğitim, kalanı ise test amaçlı kullanılacaktır.
sklearn.model_selection'dan içeri aktar train_test_split X_train, X_test, y_train, y_test = train_test_split(özellikler, etiketler, test_size=0.25, random_state = 0)
5. Model Eğitimi
Kullanacağız DoğrusalSVC bu nedenle iyi performans gösterdi, diğer modelleri de deneyebilir ve performanslarını kontrol edebilirsiniz.
sklearn.svm'den içe aktarma LinearSVC modeli = LinearSVC() model.fit(X_train, y_train)
6. Değerlendirme ve Test Etme
Modelimizin nasıl performans gösterdiğini görmek için kullanacağız sklearn’s metrics
sınıf. Bir Sınıflandırma raporu ve karışıklık matrisi kullanacağız.
sklearn'den metrikleri sklearn.metrics'den içeri aktar sınıflandırma_report # Sınıflandırma raporu y_pred = model.predict(X_test) print(metrics.classification_report(y_test, y_pred, target_names= df2['Ürün'].unique()))
Gözlemlediğiniz gibi, daha fazla desteğe sahip sınıflar (veri satırları) daha iyi f1 puanına sahipler. bu oluyor çünkü bu sınıflar daha fazla veri üzerinde eğitiliyor. Bu sorunu çözmek için, daha önce tartıştığımız gibi verileri dengelemeliyiz.
gibi sınıflar 'İpotek', 'Öğrenci kredisi 'Kredi raporlama, onarım veya diğer' daha hassas bir şekilde sınıflandırılabilir.
Karışıklık Matrisi Çizimi
seaborn'u sklearn.metrics'den sns sns.set() olarak içe aktarın blur_matrix'i içe aktar conf_mat = concept_matrix(y_test, y_pred) fig, ax = plt.subplots(figsize=(8,8)) sns.heatmap(conf_mat, annot=True, cmap) ="Blues", fmt='d', xticklabels=category_id.Product.values, yticklabels=category_id.Product.values) plt.ylabel('Actual') plt.xlabel('Öngörülen') plt.title("CONFUSION MATRIX - LinearSVCn", boyut=16);
Kredi kartı raporlama ve veri toplama sınıflarının diğerlerinden daha hassas olduğu açıkça görülmektedir.
7. Tahmin
Bazı tahminler için modelimizi denemenin zamanı geldi. bir şikayet metni ileteceğiz ve modelimiz şikayet sınıfına göre sınıflandıracak.
şikayet = """2019'da Indian University'ye yeniden kaydoldum. Birkaç gün önce Navient tarafından taciz edildim. Onlara istedikleri her şeyi sağlayan evrakları faksladım ve hala ödemeler için telefonlar alıyorum. Ayrıca, Navient şimdi kredi bürolarına ödemeye geç kaldığımı bildiriyor.Bu noktada Navient'in daha fazla adım atmamam için birlikte hareket etmesi gerekiyor"""
Metni doğrudan tahmin için eğitilmiş modele iletemeyiz, özellik çıkarma için takılı vektörleyicimizi kullanmamız gerekir ve ancak o zaman tahmin için özelliklerimizi ileteceğiz.
şikayet_id = (model.predict(tfidf.transform([şikayet]))) print("şikayet", id_2_category[şikayet_id[0]])
çıktı:
öğrenci kredisinden şikayet et
Modelimizin doğru bir şekilde tahmin ettiği açıkça görülüyor.
Sonuç
Bu yazıda NLP kullanarak bir İş Problemini Çözdük, veri temizleme, EDA, özellik çıkarma, özellik mühendisliği gibi çeşitli kavramları kullandık ve şikayet türlerinin ayrılması için modelimizi başarıyla oluşturduk.
Ayrıca sınıflandırma için BERT, LSTM gibi farklı modelleri deneyebilir, kelime gömme TFIDF Vectorizer'a göre daha üstün olduğu için kelime gömmeyi de deneyebilirsiniz.
Bir sonraki makalede, Python ile basit uygulama ile konu notları için Metin özetlemeyi ele alacağız.
NLP ile ilgili daha fazla makaleyi sitemizde okuyun. Web sitesi
Benim için herhangi bir öneriniz veya sorunuz varsa, bana ulaşmaktan çekinmeyin. Linkedin.
okuduğunuz için teşekkürler !!
Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.