Hướng dẫn dùng pandas pipeline python

Đầu tiên chúng ta sẽ cần import các packages cần thiết. Hầu hết các project machine learning đều yêu cầu sử dụng 4 packages chính là numpy, pandas [đọc, ghi và biến đổi dữ liệu], matplotlib [biểu đồ hoá] và đặc biệt là sklearn [xây dựng mô hình]. Để import các package chính thì chúng ta có thể sử dụng câu lệnh import package as alias, câu lệnh này sẽ import một package có tên là package và gán cho nó một cái tên ngắn gọn là alias trong toàn bộ file xử lý. Hoặc nếu chỉ muốn import một hàm hoặc class trong package thì bạn sử dụng câu lệnh from package.module import class_or_funct. Câu lệnh này sẽ import một class hoặc hàm số là class_or_funct bên trong package.module.

#from google.colab import drive
#import os

#drive.mount['/content/gdrive']
#os.chdir['gdrive/MyDrive/mybook']

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.compose import ColumnTransformer
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import LinearSVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import KNNImputer, SimpleImputer
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
from sklearn.metrics import fbeta_score
from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler

6.1.1. Tìm hiểu về bộ dữ liệu German credit¶

German credit là bộ dữ liệu về lịch sử tín dụng của 1000 tài khoản khác nhau. Mục tiêu của chúng ta là dựa vào lịch sử tín dụng này để dự đoán khả năng khách hàng sẽ trả nợ hay không. Bộ dữ liệu bao gồm 20 biến đầu vào trong đó có 7 biến liên tục [numeric] và 13 biến phân loại [category]. Nội dung của các biến từ 1 đến 20 lần lượt như sau:

  • Trạng thái tài khoản hiện có.

  • Kỳ hạn theo tháng [Duration]

  • Lịch sử tín dụng

  • Mục đích

  • Dư nợ tín dụng [Credit amount]

  • Tài khoản tiết kiệm [Savings account]

  • Số năm làm việc liên tục gần nhất tới thời điểm hiện tại

  • Tỷ lệ trả góp [Installment rate] theo thu nhập khả dụng

  • Giới tính và trạng thái hôn nhân

  • Những người nợ khác

  • Thời gian cư trú tại nơi ở hiện tại

  • Bất động sản

  • Tuổi

  • Trả góp khác

  • Nhà ở

  • Số lượng khoản vay tại ngân hàng

  • Nghề nghiệp

  • Số người phụ thuộc

  • Điện thoại

  • Có phải là lao động nước ngoài

Biến mục tiêu [cột response ở vị trí cuối cùng] có giá trị 1 cho khách hàng Good và 2 cho khách hàng Bad. Khách hàng Good là khác hàng vỡ nợ và chúng ta còn gọi là Negative Class trong khi khách hàng Bad là trường hợp ngược lại và là Positive class.

Đây là bộ dữ liệu mất cân bằng khi nhãn Good [Negative] chiếm 70% và nhãn Bad chỉ 30% [Positive]. Tiếp theo ta sẽ đọc vào khảo sát bộ dữ liệu này.

import pandas as pd

df = pd.read_csv["//archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data", 
                 header=None, names=['StaAcc', 'DuMon', 'CredHis', 'Purpose', 'CredAmt', 'SavAcc', \
                                     'PreEmpl', 'InsRt', 'PerSta', 'OthDebtor', 'PreRe', 'Property', \
                                     'Age', 'IntPla', 'Housing', 'ExstCredit', 'Job', 'NoMain', 'Phone', 'ForWorker', "Response"], 
                 index_col=None, sep=" "]
df.head[]

StaAccDuMonCredHisPurposeCredAmtSavAccPreEmplInsRtPerStaOthDebtor...PropertyAgeIntPlaHousingExstCreditJobNoMainPhoneForWorkerResponse01234
A11 6 A34 A43 1169 A65 A75 4 A93 A101 ... A121 67 A143 A152 2 A173 1 A192 A201 1
A12 48 A32 A43 5951 A61 A73 2 A92 A101 ... A121 22 A143 A152 1 A173 1 A191 A201 2
A14 12 A34 A46 2096 A61 A74 2 A93 A101 ... A121 49 A143 A152 1 A172 2 A191 A201 1
A11 42 A32 A42 7882 A61 A74 2 A93 A103 ... A122 45 A143 A153 1 A173 2 A191 A201 1
A11 24 A33 A40 4870 A61 A73 3 A93 A101 ... A124 53 A143 A153 2 A173 2 A191 A201 2

5 rows × 21 columns

Các trường dữ liệu và định dạng


RangeIndex: 1000 entries, 0 to 999
Data columns [total 21 columns]:
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   StaAcc      1000 non-null   object
 1   DuMon       1000 non-null   int64 
 2   CredHis     1000 non-null   object
 3   Purpose     1000 non-null   object
 4   CredAmt     1000 non-null   int64 
 5   SavAcc      1000 non-null   object
 6   PreEmpl     1000 non-null   object
 7   InsRt       1000 non-null   int64 
 8   PerSta      1000 non-null   object
 9   OthDebtor   1000 non-null   object
 10  PreRe       1000 non-null   int64 
 11  Property    1000 non-null   object
 12  Age         1000 non-null   int64 
 13  IntPla      1000 non-null   object
 14  Housing     1000 non-null   object
 15  ExstCredit  1000 non-null   int64 
 16  Job         1000 non-null   object
 17  NoMain      1000 non-null   int64 
 18  Phone       1000 non-null   object
 19  ForWorker   1000 non-null   object
 20  Response    1000 non-null   int64 
dtypes: int64[8], object[13]
memory usage: 164.2+ KB

Đây là bộ dữ liệu có chất lượng khá tốt, không có missing value ở các biến.

Thống kê mô tả

DuMonCredAmtInsRtPreReAgeExstCreditNoMainResponsecountmeanstdmin25%50%75%max
1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000 1000.000000
20.903000 3271.258000 2.973000 2.845000 35.546000 1.407000 1.155000 1.300000
12.058814 2822.736876 1.118715 1.103718 11.375469 0.577654 0.362086 0.458487
4.000000 250.000000 1.000000 1.000000 19.000000 1.000000 1.000000 1.000000
12.000000 1365.500000 2.000000 2.000000 27.000000 1.000000 1.000000 1.000000
18.000000 2319.500000 3.000000 3.000000 33.000000 1.000000 1.000000 1.000000
24.000000 3972.250000 4.000000 4.000000 42.000000 2.000000 1.000000 2.000000
72.000000 18424.000000 4.000000 4.000000 75.000000 4.000000 2.000000 2.000000

Kết quả thống kê mô tả sơ bộ trên các biến numeric cho thấy các biến khác biệt nhau về đơn vị lớn. Trung bình thấp nhất là 1.155 và cao nhất lên tới 3271.258. Như vậy khả năng cao chúng ta sẽ cần phải chuẩn hoá các biến để loại bỏ sự khác biệt về đơn vị trước khi xây dựng mô hình.

Phân phối của các biến

Chúng ta không nên tin tưởng hoàn toàn vào thống kê mô tả mà cần nhìn trực tiếp vào hình dạng phân phối của các biến. Điều này nhằm tránh những sai sót khi đánh giá về tính chất của biến khi chúng khác biệt xa nhau về phân phối. Điều này đã được giải thích trong ví dụ phân phối chú khủng long.

Chúng ta có thể dùng biểu đồ density kết hợp với histogram để tìm ra phân phối của biến.

Đối với biến liên tục.

import seaborn as sns
import warnings
warnings.simplefilter[action='ignore', category=FutureWarning]

numeric_cols = df.select_dtypes[include=['float','int']].columns

def _plot_numeric_classes[df, col, bins=10, hist=True, kde=True]:
    sns.distplot[df[col],
                 bins = bins,
                 hist = hist,
                 kde = kde]

def _distribution_numeric[df, numeric_cols, row=3, col=3, figsize=[20, 15], bins = 10]:
    '''
    numeric_cols: list các tên cột
    row: số lượng dòng trong lưới đồ thị
    col: số lượng cột trong lưới đồ thị
    figsize: kích thước biểu đồ
    bins: số lượng bins phân chia trong biểu đồ distribution
    '''
    print['number of numeric field: ', len[numeric_cols]]
    assert row*[col-1] 

Chủ Đề