Logo Zephyrnet

Phân loại văn bản nhiều nhãn bằng cách sử dụng Học chuyển giao được cung cấp bởi “Optuna”

Ngày:

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Vấn đề gán nhiều hơn một nhãn có liên quan cho văn bản được gọi là Phân loại nhiều nhãn. Ngày nay, chuyển giao học tập được sử dụng như một trong những kỹ thuật hiệu quả nhất để giải quyết vấn đề này. Và tất cả chúng ta đều phải đối mặt với những thách thức để quyết định các thông số tối ưu ở bước phân loại và thử may mắn ngẫu nhiên. Nơi đây, "tùy chọn”Vào hình ảnh.

Bhagawan Bharose Mat Baitho, Ka Pata Bhagawan Hamre Bharose Baith Ho !! (Từ Phim: Manjhi-The Mountain Man)

Xin lỗi, tôi chỉ không thể cưỡng lại bản thân khi đề cập đến câu trích dẫn này là tùy chọn đang nói với chúng tôi một cách thụ động thay vì làm theo lời can đảm, đã đến lúc tối ưu hóa (“Optuna ”-mised) hàm mục tiêu.

Giới thiệu

Trong bài viết này, chúng ta sẽ thảo luận về việc tinh chỉnh mô hình phân loại Văn bản đa nhãn dựa trên phương pháp học chuyển đổi bằng cách sử dụng tùy chọn. Đây là một khung tối ưu hóa siêu tham số tự động, được thiết kế đặc biệt cho Học máy & Học sâu. Người dùng của tùy chọn có thể tự động xây dựng các không gian tìm kiếm cho các siêu tham số. Các tính năng chính bao gồm:

  • Kiến trúc bất khả tri khung nhẹ, linh hoạt và
  • Thuật toán tối ưu hóa hiệu quả
  • Song song hóa dễ dàng
  • Hình dung nhanh

Tối ưu hóa thông số bằng cách sử dụng tùy chọn có thể được thực hiện theo ba bước sau:

  1. Kết thúc đào tạo người mẫu với Mục tiêu chức năng và trả về độ chính xác / mất mát
  2. Đề xuất các siêu tham số bằng cách sử dụng thử nghiệm vật
  3. Tạo đối tượng nghiên cứu và thực hiện tối ưu hóa

Hãy thực hiện một dự án trong đó chúng ta sẽ xây dựng mô hình Phân loại văn bản nhiều nhãn bằng cách sử dụng Học chuyển giao. Ở đây, chúng tôi sẽ điều chỉnh bước phân loại bằng cách sử dụng tùy chọn.

Bắt đầu vui vẻ !!

Mục lục

  • Bước 1: Cài đặt các gói
  • Bước 2: Thu thập dữ liệu
  • Bước 3: Nhúng câu bằng mô hình được đào tạo trước
  • Bước 4: Điều chỉnh Hyper-Parameters dựa trên Optuna
  • Bước 5: Đào tạo và dự đoán mô hình cuối cùng

Bước 1 Cài đặt các Gói

Trong dự án này, tôi sẽ sử dụng nhân Kaggle để phát triển mô hình. Vì vậy, chúng ta cần cài đặt hai gói quan trọng cho dự án này, tức là câu_chuyển_triển Optuna. Trước khi bắt đầu cài đặt, chúng ta cần đảm bảo xem GPU đã được kích hoạt hay chưa.

câu_chuyển_triển framework cung cấp một phương pháp dễ dàng để tính toán các biểu diễn vectơ dày đặc cho các câu, đoạn văn và hình ảnh. Các mô hình này dựa trên mạng biến áp như BERT / RoBERTa / XLM-RoBERTa, v.v. và đạt được hiệu suất hiện đại trong các nhiệm vụ khác nhau.

! pip cài đặt câu_transformers

Tiếp theo, chúng ta cần cài đặt tùy chọn. Nó có quy định sử dụng các trình lấy mẫu khác nhau từ Scikit-Optimize (skopt). Ở đây, chúng ta cần tạo nghiên cứu đối tượng và tối ưu hóa nó. Điều tuyệt vời là chúng ta có thể chọn xem chúng ta có muốn tối đa hóa hoặc thu nhỏ chức năng mục tiêu của chúng tôi.

! pip cài đặt optuna

Sau khi hai gói nói trên được cài đặt, hãy nhập tất cả các gói và chức năng cần thiết.

import numpy dưới dạng np nhập gấu trúc dưới dạng pd nhập ngẫu nhiên keras import torch import tensorflow dưới dạng tf nhập optuna từ optuna nhập Thử nghiệm từ sklearn.model_selection nhập train_test_split từ sklearn.model_selection nhập KFold từ keras.callbacks nhập EarlyStopping, ReduceLROnPlateau từ nhập log_lossrics. from câu_transformers nhập khẩu Công cụ chuyển đổi câu nhập khẩu matplotlib.pyplot dưới dạng plt từ số liệu nhập sklearn SEED = 99 def random_seed (SEED): random.seed (SEED) os.enosystem ['PYTHONHASHSEED'] = str (SEED) np.random.seed (SEED) torch.manual_seed (SEED) torch.cuda.manual_seed (SEED) torch.cuda.manual_seed_all (SEED) torch.backends.cudnn.deterministic = True tf.random.set_seed (SEED) random_seed (SEED)

Bước 2 Thu thập dữ liệu

Đối với dự án này, tôi sẽ sử dụng tập dữ liệu có 6136 hàng và 6 cột trong đó cột đầu tiên là trường văn bản và năm cột còn lại là các nhãn khác nhau.

train_data1 = pd.read_csv ('train.csv') train_data1.head ()

Hãy xem xét sự phân bố của các nhãn khác nhau trong tập dữ liệu của chúng tôi.

comments_labels = train_data1 [['Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5']] fig_size = plt.rcParams ["figure.figsize"] fig_size [0] = 10 fig_size [1] = 8 plt.rcParams ["figure.figsize"] = fig_size comments_labels.sum (axis = 0) .plot.bar ()

Bước 3 Nhúng câu bằng Mô hình được đào tạo trước

Bây giờ, chúng ta sẽ thực hiện nhúng văn bản bằng câu_transformer. Nó cung cấp các mô hình được đào tạo trước hiện đại cho hơn 100 ngôn ngữ và được tinh chỉnh cho nhiều trường hợp khác nhau. Đối với dự án này, chúng tôi sẽ sử dụng bert-base-không phân biệt mô hình để nhúng. Theo yêu cầu, chúng tôi cũng có thể chơi với các mô hình khác. Ở đây, chúng ta cũng cần khởi tạo max_seq_length. Nó được đặt là 512 cho trường hợp này.

model = CâuTransformer ('bert-base-unaased') model.max_seq_length = 512 print ("Độ dài chuỗi tối đa:", model.max_seq_length) câu_embeddings = model.encode (train_data1 ['Review'])

Khi quá trình nhúng câu hoàn tất, chúng tôi sẽ chia tập dữ liệu thành huấn luyện và kiểm tra. Sau đó, tập dữ liệu huấn luyện sẽ được sử dụng để tối ưu hóa tham số. Và, tập dữ liệu thử nghiệm sẽ được sử dụng để xác nhận hiệu suất của mô hình.

train1_x, test_x, train1_y, test_y = train_test_split (question_embeddings, comments_labels, train_size = 0.8, test_size = 0.2, random_state = 42)

Bước 4 Chạy siêu tham số dựa trên Optuna

Vì vậy, chúng tôi đã đến được phần thú vị và phức tạp nhất của dự án này. Bây giờ, tôi sẽ sử dụng Neural Network để giải quyết mô hình phân loại văn bản nhiều nhãn này. Khi chúng tôi xây dựng mô hình NN, các câu hỏi khác nhau xuất hiện trong đầu như số lượng lớp ẩn và nút ẩn lý tưởng, giá trị bỏ qua tối ưu, kích thước lô tối ưu, chức năng kích hoạt lý tưởng, v.v. Đây không phải là điều gì khác ngoài Siêu tham số. A siêu tham số là một tham số được đặt trước khi quá trình học bắt đầu. Các thông số này có thể điều chỉnh được và có thể ảnh hưởng trực tiếp đến cách mô hình đào tạo. Để đạt được hiệu suất tối đa, điều quan trọng là phải hiểu cách tối ưu hóa chúng. Sau đây là một số chiến lược phổ biến để tối ưu hóa Siêu tham số:

  • Tìm kiếm theo lưới: Tìm kiếm một tập hợp các siêu tham số được xác định trước theo cách thủ công
  • Tìm kiếm ngẫu nhiên: Tương tự như tìm kiếm theo lưới, nhưng thay thế tìm kiếm toàn diện bằng tìm kiếm ngẫu nhiên
  • Tối ưu hóa Bayes: Xây dựng mô hình xác suất của ánh xạ chức năng để đánh giá dữ liệu thử nghiệm
  • Tối ưu hóa dựa trên Gradient: Tính toán gradient bằng cách sử dụng siêu tham số và sau đó tối ưu hóa nó

Các thuật toán học sâu ngày nay thường chứa nhiều siêu tham số và phải mất nhiều ngày, nhiều tuần để đào tạo ra một mô hình tốt. Chỉ đơn giản là không thể tổ hợp các siêu tham số và đào tạo các mô hình riêng biệt cho từng siêu tham số mà không có bất kỳ tối ưu hóa nào. Đó là lý do tại sao chúng ta cần một bộ tối ưu hóa Hyperparameter.

tùy chọn kết hợp lấy mẫucắt tỉa cơ chế để cung cấp tối ưu hóa siêu tham số hiệu quả. Các cắt tỉa cơ chế được thực hiện trong tùy chọn dựa trên một biến thể không đồng bộ của Thuật toán chia đôi thành công (SHA)  Công cụ ước tính Parzen có cấu trúc cây (TPE) là mặc định người lấy mẫu ở Optuna.

Không có gói nào khác có thể tối ưu hóa Siêu tham số Chainer tốt hơn so với tùy chọn. Trong không gian vectơ, nó hỗ trợ cả ba kiểu dữ liệu tức là Số nguyên, Số nổi và Số phân loại. Bây giờ chúng ta hãy xem xét kỹ các bước của tùy chọn.

Ở đây, chúng tôi đã tạo một hàm mục tiêu sẽ cố gắng giảm thiểu việc mất xác thực. Các siêu tham số được đề xuất bằng cách sử dụng 'thử nghiệm' sự vật. Chúng tôi đang tối ưu hóa các siêu tham số sau:

  • Số lớp ẩn: [1,2,3]
  • Số lượng các nút ẩn bên trong các lớp ẩn: [48: len (question_embeddings [0])]
  • Chức năng kích hoạt: ['relu', 'linear', 'swish']
  • Tỷ lệ bỏ học: [0: 0.6]
  • Kích thước lô: [8: 128]

Nó có thể được mở rộng hơn nữa và được sử dụng cho các thông số khác.

def mục tiêu (dùng thử): keras.backend.clear_session () train_x, valid_x, train_y, valid_y = train_test_split (train1_x, train1_y, train_size = 0.8, test_size = 0.2, random_state = 42) #optimum số lớp ẩn n_layers = trial.suggest_int ('n_layers', 1, 3) model = keras.Sequential () cho tôi trong phạm vi (n_layers): #optimum số nút ẩn num_hiised = trial.suggest_int (f'n_units_l {i} ', 48, len (question_embeddings [0]), log = True) #optimum kích hoạt chức năng model.add (keras.layers.Dense (num_hiised, input_shape = (len (question_embeddings [0]),), kích hoạt = trial.suggest_categorical (f'activation {i} ', [' relu ',' linear ',' swish ']))) #optimum bỏ qua giá trị model.add (keras.layers.Dropout (rate = trial.suggest_float (f'dropout {i} ', 0.0, 0.6))) 
 model.add (keras.layers.Dense (5, kích hoạt = tf.keras.activations.sigmoid)) #lớp đầu ra val_ds = (valid_x, valid_y) Reduce_lr = ReduceLROnPlateau (monitor = 'val_loss', factor = 0.1, kiên nhẫn = 1, min_lr = 1e-05, verbose = 0) early_stoping = EarlyStopping (monitor = "val_loss", min_delta = 0, kiên nhẫn = 5, verbose = 0, mode = "auto", baseline = None, restore_best_weights = True) model.compile (loss = 'binary_crossentropy', metrics = 'categorical_crossentropy', Optimizer = 'Adam') # kích thước lô tối ưu histroy = model.fit (train_x, train_y, validation_data = val_ds, epochs = 200, callbacks = [Reduce_lr, Early_stoping], verbose = 0, batch_size = trial.suggest_int ('size', 8, 128)) trả về min (histroy. lịch sử ['val_loss'])

Bước tiếp theo là tạo ra một Học tập đối tượng và thực hiện các bước tối ưu hóa. Sau khi hoàn tất, chúng tôi cần tìm ra các cài đặt thông số tốt nhất từ Học tập sự vật. Ở đây, chúng tôi đã đặt ngưỡng cho cả hai Thử nghiệm tối đa (n_dùng thử) và Thời gian tối đa (thời gian chờ).

if __name__ == "__main__": study = optuna.create_study (hướng = "thu nhỏ") study.optimize (target, n_trials = 50, timeout = 1200) print ("Số lần dùng thử đã hoàn thành: {}". format (len ( study.trials))) print ("Bản dùng thử tốt nhất:") trial = study.best_trial print ("Giá trị: {}". format (trial.value))

Khi bước tối ưu hóa được thực thi hoàn toàn, chúng ta sẽ xem xét bản dùng thử tốt nhất. Nó cũng có thể được hình dung bằng cách sử dụng mã sau:

optuna.visualization.plot_optimization_history (nghiên cứu)

Từ biểu đồ, chúng ta có thể hiểu rõ ràng rằng thử nghiệm thứ 12 là tốt nhất vì nó có giá trị tổn thất tối thiểu và các siêu tham số tối ưu tương ứng có thể được tìm thấy bằng cách sử dụng mã sau:

print ("Params:") cho khóa, giá trị trong trial.params.items (): print ("{}: {}". format (key, value))

Đầu ra trông như thế này:

Tham số: n_layers: 1 n_units_l0: 682 kích hoạt0: relu bỏ học0: 0.42199525694641216 kích thước: 34

Bước 5 Đào tạo và Dự đoán Mô hình Cuối cùng

Bây giờ, chúng tôi sẽ sử dụng các tham số tối ưu để tạo ra mô hình cuối cùng và sử dụng nó cho quá trình đào tạo cuối cùng. Bây giờ, hãy tìm mô hình cuối cùng trong phần sau:

def wide_model (): model = keras.Sequential () model.add (keras.layers.Dense (682, input_shape = (len (question_embeddings [0]),), kích hoạt = tf.keras.activations.sự trở lại)) model.add (keras.layers.Dropout (0.42199525694641216)) model.add (keras.layers.Dense (5, activation = tf.keras.activations.sigmoid)) trả về mô hình

Tôi đang thử phương pháp xác thực chéo 5 Gấp để dự đoán tập dữ liệu thử nghiệm dựa trên mã sau:

skf = KFold (n_splits = 5, shuffle = True, random_state = 1234) Final_Subbmission = [] val_loss_print = [] i = 1 cho train_index, test_index trong skf.split (train1_x, train1_y): keras.backend.clear_session () print ( '##################') print (i) print ('##################') X_train, X_test = train1_x [train_index], train1_x [test_index] y_train, y_test = train1_y.iloc [train_index], train1_y.iloc [test_index] model = wide_model () val_ds = (X_test, y_test) Reduce_lr = ReduceLROnPlateau (monitor = 'val_loss', factor =loss 0.1, kiên nhẫn = 1, min_lr = 1e-05, verbose = 1) early_stoping = EarlyStopping (monitor = "val_loss", min_delta = 0, kiên nhẫn = 5, verbose = 1, mode = "auto", baseline = Không, restore_best_weights = Đúng) model.compile (loss = 'binary_crossentropy', metrics = 'categorical_crossentropy', Optimizer = 'Adam') histroy = model.fit (X_train, y_train, validation_data = val_ds, epochs = 200, callbacks = [Reduce_lr, early_stoping], verbose = 1, batch_size =34) print (min (histroy.history ['val_loss'])) val_loss_print.append (min (histroy.history ['val_loss'])) Test_seq_pred = model.p Dự đoán (test_x) Final_Subbmission.append (Test_seq_pred) i = i + 1

Phương pháp xác nhận chéo này sẽ tạo ra 5 bộ xác suất khác nhau cho mỗi lớp của tập dữ liệu Kiểm tra. Bây giờ, chúng ta sẽ lấy giá trị trung bình của những xác suất này.

Test_prob = np.mean (Final_Subbmission, 0) Test_prob = pd.DataFrame (Test_prob) Test_prob.columns = comments_labels.columns

Trong phân loại nhiều nhãn, chúng ta có thể sử dụng Độ chính xác trung bình trung bình để đo lường hiệu suất của mô hình. Hãy kiểm tra giá trị cho tập dữ liệu thử nghiệm của chúng tôi.

test_y1 = test_y.reset_index (drop = True) print ("weighted: {: .2f}" .format (metrics.average_pre precision_score (test_y1, Test_prob, average = 'weighted')))

Đầu ra trông như thế này:

trọng số: 0.90

Vì vậy, chúng tôi có thể đạt được 0.9 MAP với sự trợ giúp của tùy chọn bộ chỉnh siêu tham số. Nếu bạn vẫn chưa bị thuyết phục hoặc muốn cải thiện mô hình hơn nữa, vui lòng xem qua Trang chủ Optuna trang và trao quyền cho bản thân.

Kết luận

Trong bài viết này, tôi đã giải thích ba bước kỳ diệu để phát triển một mô hình phân loại Văn bản nhiều nhãn rất hiệu quả, tức là trước hết Nhúng câu bằng cách sử dụng câu_tập_tục, tiếp theo tùy chọn dựa tối ưu hóa siêu tham số cho mô hình Mạng thần kinh và cuối cùng là Train mô hình với một bộ siêu tham số tối ưu.

Mặc dù vậy, tôi đã giải thích về ứng dụng của tùy chọn để phân loại Văn bản nhiều nhãn. Nhưng điều này cũng có thể được điều chỉnh cho phù hợp với các mô hình Hồi quy hoặc Phân loại khác. Chúng tôi có thể áp dụng một cách thận trọng tùy chọn cho tất cả các loại tập dữ liệu có cấu trúc / không có cấu trúc. Chúng tôi có thể sử dụng nó cho PyTorch, TensorFlow, keras, XGboost, LightGBM, Scikit-Learn, MXNet, v.v. Thêm sức mạnh cho nhà khoa học dữ liệu !!

Học vui vẻ !!

Giới thiệu về tác giả

Tirthankar Das: Chuyên gia Khoa học Dữ liệu với 7.5 năm kinh nghiệm trong các lĩnh vực khác nhau như Ngân hàng & Tài chính, Hàng không, Sản xuất và Dược phẩm. Rất vui khi kết nối qua LinkedIn

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả. 

tại chỗ_img

Tin tức mới nhất

tại chỗ_img