Logo Zephyrnet

Điều chỉnh siêu tham số bằng Tìm kiếm lưới và Tìm kiếm ngẫu nhiên trong Python

Ngày:

Hình ảnh của Editor

 

Tất cả các mô hình học máy đều có một tập hợp các siêu tham số hoặc đối số phải được chỉ định bởi người thực hành.

Ví dụ: một mô hình hồi quy logistic có các bộ giải khác nhau được sử dụng để tìm các hệ số có thể mang lại cho chúng ta đầu ra tốt nhất có thể. Mỗi bộ giải sử dụng một thuật toán khác nhau để tìm ra kết quả tối ưu và không thuật toán nào trong số này hoàn toàn tốt hơn thuật toán kia. Rất khó để biết bộ giải nào sẽ hoạt động tốt nhất trên tập dữ liệu của bạn trừ khi bạn thử tất cả chúng.

Siêu tham số tốt nhất là chủ quan và khác nhau đối với mọi tập dữ liệu. Các scikit-học thư viện trong Python có một bộ siêu đường kính mặc định hoạt động khá tốt trên tất cả các kiểu máy, nhưng những bộ này không nhất thiết là tốt nhất cho mọi vấn đề.

Cách duy nhất để tìm siêu đường kính tốt nhất có thể cho tập dữ liệu của bạn là thử và sai, đây là khái niệm chính đằng sau tối ưu hóa siêu tham số.

Nói một cách đơn giản, tối ưu hóa siêu tham số là một kỹ thuật liên quan đến việc tìm kiếm thông qua một loạt các giá trị để tìm ra một tập hợp con các kết quả đạt được hiệu suất tốt nhất trên một tập dữ liệu nhất định.

Có hai kỹ thuật phổ biến được sử dụng để thực hiện tối ưu hóa siêu tham số - lưới và tìm kiếm ngẫu nhiên.

Tìm kiếm lưới

Khi thực hiện tối ưu hóa siêu tham số, trước tiên chúng ta cần xác định một không gian tham số or lưới thông số, trong đó chúng tôi bao gồm một tập hợp các giá trị siêu tham số có thể được sử dụng để xây dựng mô hình.

Sau đó, kỹ thuật tìm kiếm lưới được sử dụng để đặt các siêu tham số này trong một cấu trúc giống như ma trận và mô hình được đào tạo trên mọi kết hợp của các giá trị siêu tham số.

Mô hình có hiệu suất tốt nhất sau đó được chọn.

Tìm kiếm ngẫu nhiên

Trong khi tìm kiếm dạng lưới xem xét mọi tổ hợp siêu đường kính có thể có để tìm ra mô hình tốt nhất, thì tìm kiếm ngẫu nhiên chỉ chọn và kiểm tra sự kết hợp ngẫu nhiên của các siêu đường kính.

Kỹ thuật này lấy mẫu ngẫu nhiên từ một lưới siêu tham số thay vì tiến hành tìm kiếm toàn diện.

Chúng tôi có thể chỉ định tổng số lần chạy mà tìm kiếm ngẫu nhiên sẽ thử trước khi trả về mô hình tốt nhất.

Bây giờ bạn đã có hiểu biết cơ bản về cách hoạt động của tìm kiếm ngẫu nhiên và tìm kiếm theo lưới, tôi sẽ chỉ cho bạn cách triển khai các kỹ thuật này bằng thư viện Scikit-Learn.

Bước 1: Tải tập dữ liệu

Tải về Chất lượng rượu tập dữ liệu trên Kaggle và nhập các dòng mã sau để đọc nó bằng cách sử dụng Gấu trúc thư viện:

nhập gấu trúc dưới dạng pd df = pd.read_csv('winequality-red.csv') df.head()

Phần đầu của khung dữ liệu trông như thế này:

 

Điều chỉnh siêu tham số bằng Tìm kiếm lưới và Tìm kiếm ngẫu nhiên trong Python

Bước 2: Tiền xử lý dữ liệu

Biến mục tiêu “chất lượng” chứa các giá trị nằm trong khoảng từ 1 đến 10.

Chúng tôi sẽ biến điều này thành một nhiệm vụ phân loại nhị phân bằng cách gán giá trị 0 cho tất cả các điểm dữ liệu có giá trị chất lượng nhỏ hơn hoặc bằng 5 và giá trị 1 cho các quan sát còn lại:

nhập numpy dưới dạng np df['target'] = np.where(df['quality']>5, 1, 0)

Hãy chia các biến phụ thuộc và biến độc lập trong khung dữ liệu này:

df2 = df.drop(['chất lượng'],axis=1) X = df2.drop(['mục tiêu'],axis=1) y = df2[['mục tiêu']]

Bước 3: Xây dựng mô hình

Bây giờ, hãy khởi tạo một trình phân loại rừng ngẫu nhiên. Chúng tôi sẽ điều chỉnh các siêu đường kính của mô hình này để tạo ra thuật toán tốt nhất cho tập dữ liệu của chúng tôi:

từ sklearn.ensemble nhập RandomForestClassifier rf = RandomForestClassifier()

Bước 4: Thực hiện tìm kiếm lưới với Scikit-Learn

Xác định không gian siêu tham số

Bây giờ chúng ta sẽ thử điều chỉnh bộ siêu đường kính sau của mô hình này:

  1. “Max_deep”: Siêu tham số này biểu thị cấp độ tối đa của mỗi cây trong mô hình rừng ngẫu nhiên. Một cây sâu hơn hoạt động tốt và nắm bắt nhiều thông tin về dữ liệu huấn luyện, nhưng sẽ không tổng quát hóa tốt để kiểm tra dữ liệu. Theo mặc định, giá trị này được đặt thành “Không” trong thư viện Scikit-Learn, có nghĩa là các cây được để mở rộng hoàn toàn.
  2. “Tối đa tính năng”: Số lượng tính năng tối đa mà mô hình rừng ngẫu nhiên được phép thử ở mỗi lần phân tách. Theo mặc định trong Scikit-Learn, giá trị này được đặt thành căn bậc hai của tổng số biến trong tập dữ liệu.
  3. “N_ước tính”: Số cây quyết định trong rừng. Số lượng công cụ ước tính mặc định trong Scikit-Learn là 10.
  4. “Min_samples_leaf”: Số lượng mẫu tối thiểu cần có tại nút lá của mỗi cây. Giá trị mặc định là 1 trong Scikit-Learn.
  5. “Tối_mẫu_tách”: Số lượng mẫu tối thiểu cần thiết để tách một nút bên trong của mỗi cây. Giá trị mặc định là 2 trong Scikit-Learn.

Bây giờ chúng ta sẽ tạo một từ điển gồm nhiều giá trị có thể có cho tất cả các siêu đường kính ở trên. Đây cũng được gọi là không gian siêu tham sốvà sẽ được tìm kiếm thông qua để tìm ra sự kết hợp tốt nhất của các đối số:

grid_space={'max_depth':[3,5,10,None], 'n_estimators':[10,100,200], 'max_features':[1,3,5,7], 'min_samples_leaf':[1,2,3] , 'min_samples_split':[1,2,3] }

Chạy tìm kiếm lưới

Bây giờ, chúng ta cần thực hiện tìm kiếm để tìm tổ hợp siêu tham số tốt nhất cho mô hình:

từ sklearn.model_selection nhập GridSearchCV grid = GridSearchCV(rf,param_grid=grid_space,cv=3,scoring='accuracy') model_grid = grid.fit(X,y)

Đánh giá kết quả mô hình

Cuối cùng, hãy in ra độ chính xác của mô hình tốt nhất, cùng với tập hợp các siêu đường kính mang lại điểm số này:

print('Siêu tham số tốt nhất là: '+str(model_grid.best_params_)) print('Điểm tốt nhất là: '+str(model_grid.best_score_))

Mô hình tốt nhất đưa ra điểm chính xác xấp xỉ 0.74 và các siêu tham số của nó như sau:

 

Điều chỉnh siêu tham số bằng Tìm kiếm lưới và Tìm kiếm ngẫu nhiên trong Python

 

Bây giờ, hãy sử dụng tìm kiếm ngẫu nhiên trên cùng một tập dữ liệu để xem liệu chúng ta có nhận được kết quả tương tự hay không.

Bước 5: Thực hiện tìm kiếm ngẫu nhiên bằng Scikit-Learn

Xác định không gian siêu tham số

Bây giờ, hãy xác định không gian siêu tham số để thực hiện tìm kiếm ngẫu nhiên. Không gian tham số này có thể có phạm vi giá trị lớn hơn phạm vi giá trị mà chúng tôi đã tạo cho tìm kiếm dạng lưới, vì tìm kiếm ngẫu nhiên không thử mọi tổ hợp siêu tham số.

Nó lấy mẫu siêu tham số một cách ngẫu nhiên để tìm ra những siêu tham số tốt nhất, có nghĩa là không giống như tìm kiếm dạng lưới, tìm kiếm ngẫu nhiên có thể xem qua một số lượng lớn các giá trị một cách nhanh chóng.

từ scipy.stats nhập randint rs_space={'max_depth':list(np.arange(10, 100, step=10)) + [None], 'n_estimators':np.arange(10, 500, step=50), 'max_features':randint(1,7), 'criterion':['gini','entropy'], 'min_samples_leaf':randint(1,4), 'min_samples_split':np.arange(2, 10, step= 2) }

Chạy tìm kiếm ngẫu nhiên

Chạy các dòng mã sau để chạy tìm kiếm ngẫu nhiên trên mô hình: (Lưu ý rằng chúng tôi đã chỉ định n_iter=500, có nghĩa là tìm kiếm ngẫu nhiên sẽ chạy 500 lần trước khi chọn mô hình tốt nhất. Bạn có thể thử nghiệm với số lần lặp lại khác nhau để xem cái nào mang lại cho bạn kết quả tối ưu. Hãy nhớ rằng một số lượng lớn các lần lặp lại sẽ mang lại hiệu suất tốt hơn nhưng tốn thời gian).

từ sklearn.model_selection nhập RandomizedSearchCV rf = RandomForestClassifier() rf_random = RandomizedSearchCV(rf, dấu cách, n_iter=500, chấm điểm='accuracy', n_jobs=-1, cv=3) model_random = rf_random.fit(X,y)

Đánh giá kết quả mô hình

Bây giờ, hãy chạy các dòng mã sau để in các siêu tham số tốt nhất được tìm thấy bằng cách tìm kiếm ngẫu nhiên, cùng với độ chính xác cao nhất của mô hình tốt nhất:

print('Siêu tham số tốt nhất là: '+str(model_random.best_params_)) print('Điểm tốt nhất là: '+str(model_random.best_score_))

Các siêu đường kính tốt nhất được tìm thấy bằng cách tìm kiếm ngẫu nhiên như sau:

 

Điều chỉnh siêu tham số bằng Tìm kiếm lưới và Tìm kiếm ngẫu nhiên trong Python

 

Độ chính xác cao nhất của tất cả các mô hình được xây dựng cũng xấp xỉ 0.74.

Quan sát rằng cả tìm kiếm dạng lưới và tìm kiếm ngẫu nhiên đều hoạt động khá tốt trên tập dữ liệu. Hãy nhớ rằng nếu bạn thực hiện một tìm kiếm ngẫu nhiên trên cùng một mã, thì kết quả của bạn có thể rất khác so với những gì tôi đã trình bày ở trên.

Điều này là do nó đang tìm kiếm thông qua một lưới tham số rất lớn bằng cách sử dụng khởi tạo ngẫu nhiên, có thể hiển thị kết quả thay đổi đáng kể mỗi khi bạn sử dụng kỹ thuật này.

Hoàn thành mã

Đây là mã hoàn chỉnh được sử dụng trong hướng dẫn:

# nhập nhập gấu trúc dưới dạng pd nhập numpy dưới dạng np từ sklearn.ensemble nhập RandomForestClassifier từ sklearn.model_selection nhập GridSearchCV từ scipy.stats nhập randint từ sklearn.model_selection nhập RandomizedSearchCV # đọc bộ dữ liệu df = pd.read_csv('winequality-red.csv ') # tiền xử lý df['mục tiêu'] = np.where(df['quality']>5, 1, 0) df2 = df.drop(['quality'],axis=1) X = df2.drop( ['mục tiêu'],axis=1) y = df2[['mục tiêu']] # khởi tạo rừng ngẫu nhiên rf = RandomForestClassifier() # tìm kiếm lưới cv grid_space={'max_depth':[3,5,10,None], 'n_estimators':[10,100,200], 'max_features':[1,3,5,7], 'min_samples_leaf':[1,2,3], 'min_samples_split':[1,2,3] } grid = GridSearchCV( rf,param_grid=grid_space,cv=3,scoring='accuracy') model_grid = grid.fit(X,y) # kết quả tìm kiếm lưới print('Siêu tham số tìm kiếm lưới tốt nhất là: '+str(model_grid.best_params_)) print( 'Điểm tìm kiếm lưới tốt nhất là: '+str(model_grid.best_score_)) # cv tìm kiếm ngẫu nhiên rs_space={'max_depth':list(np.arange(10, 100, step=10)) + [None], 'n_estimators' :np.arange(10, 500, step=50), 'max_features':randint(1,7), 'criterion':['gini','entropy'], 'min_samples_leaf':randint(1,4), 'min_samples_split':np.arange(2, 10, step=2) } rf = RandomForestClassifier() rf_random = RandomizedSearchCV(rf, rs_space, n_iter=500, score='accuracy', n_jobs=-1, cv=3) model_random = rf_random.fit(X,y) # kết quả tìm kiếm ngẫu nhiên ngẫu nhiên print('Siêu tham số tìm kiếm ngẫu nhiên tốt nhất là: '+str(model_random.best_params_)) print('Điểm tìm kiếm ngẫu nhiên tốt nhất là: '+str(model_random.best_params_))

Nếu bạn từng thấy mình đang cố gắng chọn giữa tìm kiếm dạng lưới và tìm kiếm ngẫu nhiên, thì đây là một số gợi ý giúp bạn quyết định nên sử dụng cái nào:

  1. Sử dụng tìm kiếm dạng lưới nếu bạn đã có một phạm vi bao gồm các giá trị siêu tham số đã biết sẽ hoạt động tốt. Đảm bảo giữ cho không gian tham số của bạn nhỏ, vì tìm kiếm dạng lưới có thể cực kỳ tốn thời gian.
  2. Sử dụng tìm kiếm ngẫu nhiên trên nhiều loại giá trị nếu bạn chưa có ý tưởng về các tham số sẽ hoạt động tốt trên mô hình của mình. Tìm kiếm ngẫu nhiên nhanh hơn tìm kiếm theo lưới và phải luôn được sử dụng khi bạn có không gian tham số lớn.
  3. Bạn cũng nên sử dụng cả tìm kiếm ngẫu nhiên và tìm kiếm theo lưới để có kết quả tốt nhất có thể.

Bạn có thể sử dụng tìm kiếm ngẫu nhiên trước với không gian tham số lớn vì nó nhanh hơn. Sau đó, sử dụng siêu đường kính tốt nhất được tìm thấy bằng tìm kiếm ngẫu nhiên để thu hẹp lưới tham số và cung cấp phạm vi giá trị nhỏ hơn cho tìm kiếm lưới.

 
 
Natasha Selvaraj là một nhà khoa học dữ liệu tự học với niềm đam mê viết lách. Bạn có thể kết nối với cô ấy trên LinkedIn.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img