Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Phát hiện gian lận (Fraud Detection) trong Python

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