Gian lận xuất hiện trong nhiều giao dịch. Chúng ta có thể áp dụng thuật toán machine learning để phân tích dữ liệu quá khứ và dự đoán khả năng một giao dịch là gian lận. Trong ví dụ này, chúng ta lấy giao dịch thẻ tín dụng, phân tích dữ liệu, tạo đặc trưng và nhãn, cuối cùng áp dụng thuật toán ML để phân loại giao dịch là gian lận hay không. Sau đó tìm độ chính xác, precision và f-score của mô hình.
Chuẩn bị dữ liệu
Ở bước này, ta đọc dữ liệu nguồn, nghiên cứu các biến có trong đó và xem một vài dữ liệu mẫu. Điều này giúp biết các cột khác nhau trong tập dữ liệu và nghiên cứu đặc điểm của chúng. Ta dùng thư viện Pandas để tạo DataFrame dùng cho các bước sau.
Ví dụ
import pandas as pd
# Load creditcard.csv bằng pandas
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
# https://www.kaggle.com/mlg-ulb/creditcardfraud
# In 5 bản ghi đầu
print(du_lieu_vao[0:5], "\n")
# In hình dạng toàn bộ tập dữ liệu
print("Hình dạng tập dữ liệu hoàn chỉnh")
print(du_lieu_vao.shape, "\n")
Kết quả
Chạy mã trên cho kết quả sau:
Time V1 V2 V3 ... V27 V28 Amount Class 0 0.0 -1.359807 -0.072781 2.536347 ... 0.133558 -0.021053 149.62 0 1 0.0 1.191857 0.266151 0.166480 ... -0.008983 0.014724 2.69 0 2 1.0 -1.358354 -1.340163 1.773209 ... -0.055353 -0.059752 378.66 0 3 1.0 -0.966272 -0.185226 1.792993 ... 0.062723 0.061458 123.50 0 4 2.0 -1.158233 0.877737 1.548718 ... 0.219422 0.215153 69.99 0 [5 rows x 31 columns] Hình dạng tập dữ liệu hoàn chỉnh (284807, 31)
Kiểm tra mất cân bằng dữ liệu
Bây giờ kiểm tra dữ liệu phân bố như thế nào giữa giao dịch gian lận và thật. Điều này cho ý tưởng phần trăm dữ liệu dự kiến là gian lận. Trong ML, điều này gọi là data imbalance. Nếu hầu hết giao dịch không gian lận, việc phân loại vài giao dịch là thật hay gian lận trở nên khó khăn. Ta dùng cột Class để đếm số lượng giao dịch gian lận và thật, sau đó tính phần trăm thực tế của giao dịch gian lận.
Ví dụ
import pandas as pd
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
gian_lan = du_lieu_vao[du_lieu_vao['Class'] == 1]
that = du_lieu_vao[du_lieu_vao['Class'] == 0]
ty_le = len(gian_lan) / float(len(that))
print(ty_le)
print('Số trường hợp gian lận: {}'.format(len(du_lieu_vao[du_lieu_vao['Class'] == 1])))
print('Số trường hợp thật: {}'.format(len(du_lieu_vao[du_lieu_vao['Class'] == 0])), "\n")
Kết quả
Chạy mã trên cho kết quả sau:
0.0017304750013189597 Số trường hợp gian lận: 492 Số trường hợp thật: 284315
Chi tiết loại giao dịch
Ta điều tra sâu hơn vào bản chất giao dịch cho mỗi loại gian lận và không gian lận. Thử ước lượng thống kê các tham số như trung bình, độ lệch chuẩn, giá trị max, min và các phân vị. Điều này đạt được bằng phương thức describe.
Ví dụ
import pandas as pd
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
gian_lan = du_lieu_vao[du_lieu_vao['Class'] == 1]
that = du_lieu_vao[du_lieu_vao['Class'] == 0]
# Trường hợp gian lận
print("Trường hợp gian lận")
print("----------------------")
print(gian_lan.Amount.describe(), "\n")
# Trường hợp thật
print("Trường hợp thật")
print("----------------------")
print(that.Amount.describe(), "\n")
Kết quả
Chạy mã trên cho kết quả sau:
Trường hợp gian lận ---------------------- count 492.000000 mean 122.211321 std 256.683288 min 0.000000 25% 1.000000 50% 9.250000 75% 105.890000 max 2125.870000 Name: Amount, dtype: float64 Trường hợp thật ---------------------- count 284315.000000 mean 88.291022 std 250.105092 min 0.000000 25% 5.650000 50% 22.000000 75% 77.050000 max 25691.160000 Name: Amount, dtype: float64
Tách đặc trưng và nhãn (Separating features and Label)
Trước khi triển khai thuật toán ML, ta cần quyết định đặc trưng và nhãn. Nghĩa là phân loại biến phụ thuộc và độc lập. Trong tập dữ liệu, cột Class phụ thuộc vào tất cả các cột còn lại. Vì vậy ta tạo DataFrame cho cột cuối và DataFrame khác cho tất cả các cột còn lại. Các DataFrame này sẽ dùng để huấn luyện mô hình.
Ví dụ
import pandas as pd
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
# Tách đặc trưng (X) và nhãn (y)
# Chọn tất cả cột trừ cột cuối cho tất cả hàng
X = du_lieu_vao.iloc[:, :-1].values
# Chọn cột cuối của tất cả hàng
Y = du_lieu_vao.iloc[:, -1].values
print(X.shape)
print(Y.shape)
Kết quả
Chạy mã trên cho kết quả sau:
(284807, 30) (284807,)
Huấn luyện mô hình
Chia tập dữ liệu thành hai phần: huấn luyện và kiểm thử. Tham số test_size quyết định phần trăm dữ liệu chỉ dùng cho kiểm thử. Bài tập này giúp ta tin cậy vào mô hình đang tạo.
Ví dụ
import pandas as pd
from sklearn.model_selection import train_test_split
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
X = du_lieu_vao.iloc[:, :-1].values
Y = du_lieu_vao.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
Áp dụng Decision Tree Classification
Có nhiều thuật toán khác nhau cho tình huống này. Nhưng ta chọn Decision Tree làm thuật toán phân loại. Với độ sâu tối đa của cây là 4 và cung cấp mẫu test để dự đoán giá trị. Cuối cùng, tính độ chính xác của kết quả từ test để quyết định có tiếp tục với thuật toán này hay không.
Ví dụ
import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
X = du_lieu_vao.iloc[:, :-1].values
Y = du_lieu_vao.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
classifier = DecisionTreeClassifier(max_depth=4)
classifier.fit(X_train, Y_train)
du_doan = classifier.predict(X_test)
print("\nGiá trị dự đoán:\n", du_doan)
# Accuracy
DT = metrics.accuracy_score(Y_test, du_doan) * 100
print("\nĐộ chính xác sử dụng DecisionTreeClassifier:", DT)
Kết quả
Chạy mã trên cho kết quả sau:
predicted values: [0 0 0 ... 0 0 0] Độ chính xác sử dụng DecisionTreeClassifier: 99.9367999719111
Tìm các tham số đánh giá
Khi độ chính xác chấp nhận được, ta tiến hành đánh giá mô hình bằng các tham số khác. Ta dùng Precision, recall và F-score. Precision là tỷ lệ các instance liên quan trong các instance được truy xuất, recall là tỷ lệ tổng số instance liên quan thực sự được truy xuất. F-score cung cấp điểm đơn cân bằng cả precision và recall.
Ví dụ
import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.tree import DecisionTreeClassifier
du_lieu_vao = pd.read_csv('E:\\creditcard.csv')
X = du_lieu_vao.iloc[:, :-1].values
Y = du_lieu_vao.iloc[:, -1].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
classifier = DecisionTreeClassifier(max_depth=4)
classifier.fit(X_train, Y_train)
du_doan = classifier.predict(X_test)
# Accuracy
DT = metrics.accuracy_score(Y_test, du_doan) * 100
print("\nĐộ chính xác DecisionTreeClassifier:", DT)
# Precision
print('precision')
precision = precision_score(Y_test, du_doan, pos_label=1)
print(precision)
# Recall
print('recall')
recall = recall_score(Y_test, du_doan, pos_label=1)
print(recall)
# F1-score
print('f-Score')
fscore = f1_score(Y_test, du_doan, pos_label=1)
print(fscore)
Kết quả
Chạy mã trên cho kết quả sau:
Độ chính xác DecisionTreeClassifier: 99.9403110845827 precision 0.810126582278481 recall 0.7710843373493976 f-Score 0.7901234567901234