Hướng dẫn Scikit-Learn: Cách cài đặt và ví dụ về Scikit-Learn
Scikit-learning là gì?
Học hỏi là một nguồn mở Python thư viện cho máy học. Nó hỗ trợ các thuật toán tiên tiến như KNN, XGBoost, random forest và SVM. Nó được xây dựng trên NumPy. Scikit-learn được sử dụng rộng rãi trong cuộc thi Kaggle cũng như các công ty công nghệ nổi tiếng. Nó giúp xử lý trước, giảm chiều (lựa chọn tham số), phân loại, hồi quy, phân cụm và lựa chọn mô hình.
Scikit-learn có tài liệu tốt nhất trong tất cả các thư viện nguồn mở. Nó cung cấp cho bạn một biểu đồ tương tác tại https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html.

Scikit-learn không khó sử dụng và mang lại kết quả tuyệt vời. Tuy nhiên, scikit learn không hỗ trợ tính toán song song. Có thể chạy thuật toán deep learning với nó nhưng nó không phải là giải pháp tối ưu, đặc biệt nếu bạn biết cách sử dụng TensorFlow.
Cách tải xuống và cài đặt Scikit-learn
Bây giờ trong này Python Hướng dẫn về Scikit-learn, chúng ta sẽ tìm hiểu cách tải xuống và cài đặt Scikit-learn:
Lựa chọn 1: AWS
scikit-learn có thể được sử dụng trên AWS. Vui lòng xem Hình ảnh docker đã được cài đặt sẵn scikit-learn.
Để sử dụng phiên bản dành cho nhà phát triển, hãy sử dụng lệnh trong Jupyter
import sys !{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git
Lựa chọn 2: Mac hoặc Windows sử dụng Anaconda
Để tìm hiểu về cài đặt Anaconda hãy tham khảo https://www.guru99.com/download-install-tensorflow.html
Gần đây, các nhà phát triển scikit đã phát hành một phiên bản phát triển nhằm giải quyết vấn đề thường gặp ở phiên bản hiện tại. Chúng tôi thấy việc sử dụng phiên bản dành cho nhà phát triển sẽ thuận tiện hơn phiên bản hiện tại.
Cách cài đặt scikit-learn với Môi trường Conda
Nếu bạn đã cài đặt scikit-learn với môi trường conda, vui lòng làm theo bước để cập nhật lên phiên bản 0.20
Bước 1) Kích hoạt môi trường tensorflow
source activate hello-tf
Bước 2) Loại bỏ scikit Lean bằng lệnh conda
conda remove scikit-learn
Bước 3) Cài đặt phiên bản dành cho nhà phát triển.
Cài đặt phiên bản dành cho nhà phát triển scikit learn cùng với các thư viện cần thiết.
conda install -c anaconda git pip install Cython pip install h5py pip install git+git://github.com/scikit-learn/scikit-learn.git
LƯU Ý: Windows người dùng sẽ cần phải cài đặt Microsoft Hình ảnh C++ 14. Bạn có thể lấy nó từ đây
Ví dụ về Scikit-Learn với Machine Learning
Hướng dẫn Scikit này được chia thành hai phần:
- Học máy với scikit-learn
- Cách tin cậy mô hình của bạn với LIME
Phần đầu tiên trình bày chi tiết cách xây dựng đường ống, tạo mô hình và điều chỉnh siêu tham số trong khi phần thứ hai cung cấp thông tin hiện đại nhất về cách lựa chọn mô hình.
Bước 1) Nhập dữ liệu
Trong hướng dẫn tìm hiểu Scikit này, bạn sẽ sử dụng tập dữ liệu dành cho người lớn.
Để biết thông tin cơ bản về tập dữ liệu này, hãy tham khảo Nếu bạn muốn biết thêm về số liệu thống kê mô tả, vui lòng sử dụng các công cụ Dive và Tổng quan.
Xem hướng dẫn này tìm hiểu thêm về Lặn và Tổng quan
Bạn nhập tập dữ liệu bằng Pandas. Lưu ý rằng bạn cần chuyển đổi loại biến liên tục ở định dạng float.
Bộ dữ liệu này bao gồm tám biến phân loại:
Các biến phân loại được liệt kê trong CATE_FEATURES
- lớp học nghề
- giáo dục
- hôn nhân
- nghề nghiệp
- mối quan hệ
- cuộc đua
- quan hệ tình dục
- quê hương
hơn nữa, sáu biến liên tục:
Các biến liên tục được liệt kê trong CONTI_FEATURES
- tuổi
- fnlwgt
- giáo dục_num
- tăng vốn
- vốn_lỗ
- giờ_tuần
Lưu ý rằng chúng tôi điền danh sách bằng tay để bạn hiểu rõ hơn về những cột chúng tôi đang sử dụng. Cách nhanh hơn để xây dựng danh sách phân loại hoặc liên tục là sử dụng:
## List Categorical CATE_FEATURES = df_train.iloc[:,:-1].select_dtypes('object').columns print(CATE_FEATURES) ## List continuous CONTI_FEATURES = df_train._get_numeric_data() print(CONTI_FEATURES)
Đây là mã để nhập dữ liệu:
# Import dataset import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] ### Define continuous list CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week'] ### Define categorical list CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country'] ## Prepare the data features = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train[CONTI_FEATURES] =df_train[CONTI_FEATURES].astype('float64') df_train.describe()
tuổi | fnlwgt | giáo dục_num | tăng vốn | vốn_lỗ | giờ_tuần | |
---|---|---|---|---|---|---|
tính | 32561.000000 | 3.256100e + 04 | 32561.000000 | 32561.000000 | 32561.000000 | 32561.000000 |
nghĩa là | 38.581647 | 1.897784e + 05 | 10.080679 | 1077.648844 | 87.303830 | 40.437456 |
tiêu chuẩn | 13.640433 | 1.055500e + 05 | 2.572720 | 7385.292085 | 402.960219 | 12.347429 |
phút | 17.000000 | 1.228500e + 04 | 1.000000 | 0.000000 | 0.000000 | 1.000000 |
25% | 28.000000 | 1.178270e + 05 | 9.000000 | 0.000000 | 0.000000 | 40.000000 |
50% | 37.000000 | 1.783560e + 05 | 10.000000 | 0.000000 | 0.000000 | 40.000000 |
75% | 48.000000 | 2.370510e + 05 | 12.000000 | 0.000000 | 0.000000 | 45.000000 |
tối đa | 90.000000 | 1.484705e + 06 | 16.000000 | 99999.000000 | 4356.000000 | 99.000000 |
Bạn có thể kiểm tra số lượng giá trị duy nhất của các đối tượng địa lý gốc_country. Bạn có thể thấy chỉ có một hộ gia đình đến từ Hà Lan-Hà Lan. Hộ gia đình này sẽ không cung cấp cho chúng ta bất kỳ thông tin nào mà sẽ gặp phải một sai sót trong quá trình tập huấn.
df_train.native_country.value_counts()
United-States 29170 Mexico 643 ? 583 Philippines 198 Germany 137 Canada 121 Puerto-Rico 114 El-Salvador 106 India 100 Cuba 95 England 90 Jamaica 81 South 80 China 75 Italy 73 Dominican-Republic 70 Vietnam 67 Guatemala 64 Japan 62 Poland 60 Columbia 59 Taiwan 51 Haiti 44 Iran 43 Portugal 37 Nicaragua 34 Peru 31 France 29 Greece 29 Ecuador 28 Ireland 24 Hong 20 Cambodia 19 Trinadad&Tobago 19 Thailand 18 Laos 18 Yugoslavia 16 Outlying-US(Guam-USVI-etc) 14 Honduras 13 Hungary 13 Scotland 12 Holand-Netherlands 1 Name: native_country, dtype: int64
Bạn có thể loại trừ hàng không có nhiều thông tin này khỏi tập dữ liệu
## Drop Netherland, because only one row df_train = df_train[df_train.native_country != "Holand-Netherlands"]
Tiếp theo, bạn lưu trữ vị trí của các đối tượng liên tục trong danh sách. Bạn sẽ cần nó trong bước tiếp theo để xây dựng quy trình.
Mã bên dưới sẽ lặp qua tất cả các tên cột trong CONTI_FEATURES và lấy vị trí của nó (tức là số của nó), sau đó nối nó vào danh sách có tên conti_features
## Get the column index of the categorical features conti_features = [] for i in CONTI_FEATURES: position = df_train.columns.get_loc(i) conti_features.append(position) print(conti_features)
[0, 2, 10, 4, 11, 12]
Đoạn mã dưới đây thực hiện công việc tương tự như trên nhưng đối với biến phân loại. Mã bên dưới lặp lại những gì bạn đã làm trước đó, ngoại trừ các tính năng phân loại.
## Get the column index of the categorical features categorical_features = [] for i in CATE_FEATURES: position = df_train.columns.get_loc(i) categorical_features.append(position) print(categorical_features)
[1, 3, 5, 6, 7, 8, 9, 13]
Bạn có thể xem tập dữ liệu. Lưu ý rằng, mỗi đặc điểm phân loại là một chuỗi. Bạn không thể cung cấp mô hình bằng giá trị chuỗi. Bạn cần chuyển đổi tập dữ liệu bằng biến giả.
df_train.head(5)
Trên thực tế, bạn cần tạo một cột cho mỗi nhóm trong đối tượng địa lý. Trước tiên, bạn có thể chạy mã bên dưới để tính tổng số cột cần thiết.
print(df_train[CATE_FEATURES].nunique(), 'There are',sum(df_train[CATE_FEATURES].nunique()), 'groups in the whole dataset')
workclass 9 education 16 marital 7 occupation 15 relationship 6 race 5 sex 2 native_country 41 dtype: int64 There are 101 groups in the whole dataset
Toàn bộ tập dữ liệu chứa 101 nhóm như được hiển thị ở trên. Ví dụ, các tính năng của workclass có chín nhóm. Bạn có thể trực quan hóa tên của các nhóm bằng các mã sau
Unique() trả về các giá trị duy nhất của các tính năng phân loại.
for i in CATE_FEATURES: print(df_train[i].unique())
['State-gov' 'Self-emp-not-inc' 'Private' 'Federal-gov' 'Local-gov' '?' 'Self-emp-inc' 'Without-pay' 'Never-worked'] ['Bachelors' 'HS-grad' '11th' 'Masters' '9th' 'Some-college' 'Assoc-acdm' 'Assoc-voc' '7th-8th' 'Doctorate' 'Prof-school' '5th-6th' '10th' '1st-4th' 'Preschool' '12th'] ['Never-married' 'Married-civ-spouse' 'Divorced' 'Married-spouse-absent' 'Separated' 'Married-AF-spouse' 'Widowed'] ['Adm-clerical' 'Exec-managerial' 'Handlers-cleaners' 'Prof-specialty' 'Other-service' 'Sales' 'Craft-repair' 'Transport-moving' 'Farming-fishing' 'Machine-op-inspct' 'Tech-support' '?' 'Protective-serv' 'Armed-Forces' 'Priv-house-serv'] ['Not-in-family' 'Husband' 'Wife' 'Own-child' 'Unmarried' 'Other-relative'] ['White' 'Black' 'Asian-Pac-Islander' 'Amer-Indian-Eskimo' 'Other'] ['Male' 'Female'] ['United-States' 'Cuba' 'Jamaica' 'India' '?' 'Mexico' 'South' 'Puerto-Rico' 'Honduras' 'England' 'Canada' 'Germany' 'Iran' 'Philippines' 'Italy' 'Poland' 'Columbia' 'Cambodia' 'Thailand' 'Ecuador' 'Laos' 'Taiwan' 'Haiti' 'Portugal' 'Dominican-Republic' 'El-Salvador' 'France' 'Guatemala' 'China' 'Japan' 'Yugoslavia' 'Peru' 'Outlying-US(Guam-USVI-etc)' 'Scotland' 'Trinadad&Tobago' 'Greece' 'Nicaragua' 'Vietnam' 'Hong' 'Ireland' 'Hungary']
Do đó, tập dữ liệu huấn luyện sẽ chứa 101 + 7 cột. Bảy cột cuối cùng là các tính năng liên tục.
Scikit-learn có thể đảm nhiệm việc chuyển đổi. Nó được thực hiện theo hai bước:
- Đầu tiên, bạn cần chuyển đổi chuỗi thành ID. Ví dụ: Chính phủ Nhà nước sẽ có ID 1, ID tự doanh 2, v.v. Hàm LabelEncode thực hiện việc này cho bạn
- Chuyển đổi từng ID vào một cột mới. Như đã đề cập trước đó, tập dữ liệu có ID của 101 nhóm. Do đó sẽ có 101 cột ghi lại tất cả các nhóm tính năng được phân loại. Scikit-learn có chức năng gọi là OneHotEncode thực hiện thao tác này
Bước 2) Tạo tập huấn luyện/kiểm tra
Bây giờ tập dữ liệu đã sẵn sàng, chúng ta có thể chia nó theo tỷ lệ 80/20.
80% cho tập huấn luyện và 20% cho tập kiểm tra.
Bạn có thể sử dụng train_test_split. Đối số đầu tiên là khung dữ liệu là các tính năng và đối số thứ hai là khung dữ liệu nhãn. Bạn có thể chỉ định kích thước của tập kiểm tra bằng test_size.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df_train[features], df_train.label, test_size = 0.2, random_state=0) X_train.head(5) print(X_train.shape, X_test.shape)
(26048, 14) (6512, 14)
Bước 3) Xây dựng đường ống
Quy trình giúp việc cung cấp dữ liệu nhất quán cho mô hình trở nên dễ dàng hơn.
Ý tưởng đằng sau là đưa dữ liệu thô vào một 'đường ống' để thực hiện các thao tác.
Chẳng hạn, với tập dữ liệu hiện tại, bạn cần chuẩn hóa các biến liên tục và chuyển đổi dữ liệu phân loại. Lưu ý rằng bạn có thể thực hiện bất kỳ thao tác nào bên trong đường ống. Ví dụ: nếu bạn có 'NA'' trong tập dữ liệu, bạn có thể thay thế chúng bằng giá trị trung bình hoặc trung vị. Bạn cũng có thể tạo các biến mới.
Bạn có quyền lựa chọn; mã hóa cứng hai quy trình hoặc tạo một đường dẫn. Lựa chọn đầu tiên có thể dẫn đến rò rỉ dữ liệu và tạo ra sự mâu thuẫn theo thời gian. Một lựa chọn tốt hơn là sử dụng đường ống.
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder from sklearn.compose import ColumnTransformer, make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.linear_model import LogisticRegression
Quy trình sẽ thực hiện hai thao tác trước khi cung cấp cho bộ phân loại hậu cần:
- Chuẩn hóa biến: `StandardScaler()“
- Chuyển đổi các tính năng phân loại: OneHotEncode(sparse=False)
Bạn có thể thực hiện hai bước bằng cách sử dụng make_column_transformer. Chức năng này không có trong phiên bản hiện tại của scikit-learn (0.19). Phiên bản hiện tại không thể thực hiện bộ mã hóa nhãn và một bộ mã hóa nóng trong đường ống. Đó là một lý do khiến chúng tôi quyết định sử dụng phiên bản dành cho nhà phát triển.
make_column_transformer rất dễ sử dụng. Bạn cần xác định cột nào sẽ áp dụng phép biến đổi và phép biến đổi nào sẽ hoạt động. Chẳng hạn, để chuẩn hóa tính năng liên tục, bạn có thể thực hiện:
- conti_features, StandardScaler() bên trong make_column_transformer.
- conti_features: danh sách có biến liên tục
- StandardScaler: chuẩn hóa biến
Đối tượng OneHotEncode bên trong make_column_transformer tự động mã hóa nhãn.
preprocess = make_column_transformer( (conti_features, StandardScaler()), ### Need to be numeric not string to specify columns name (categorical_features, OneHotEncoder(sparse=False)) )
Bạn có thể kiểm tra xem đường ống có hoạt động với fit_transform không. Bộ dữ liệu phải có hình dạng sau: 26048, 107
preprocess.fit_transform(X_train).shape
(26048, 107)
Máy biến đổi dữ liệu đã sẵn sàng để sử dụng. Bạn có thể tạo đường dẫn bằng make_pipeline. Sau khi dữ liệu được chuyển đổi, bạn có thể cung cấp hồi quy logistic.
model = make_pipeline( preprocess, LogisticRegression())
Đào tạo một mô hình bằng scikit-learn là chuyện nhỏ. Bạn cần sử dụng đối tượng phù hợp trước đường dẫn, tức là mô hình. Bạn có thể in độ chính xác bằng đối tượng điểm từ thư viện scikit-learn
model.fit(X_train, y_train) print("logistic regression score: %f" % model.score(X_test, y_test))
logistic regression score: 0.850891
Cuối cùng, bạn có thể dự đoán các lớp bằng Predict_proba. Nó trả về xác suất cho mỗi lớp. Lưu ý rằng nó có tổng bằng một.
model.predict_proba(X_test)
array([[0.83576663, 0.16423337], [0.94582765, 0.05417235], [0.64760587, 0.35239413], ..., [0.99639252, 0.00360748], [0.02072181, 0.97927819], [0.56781353, 0.43218647]])
Bước 4) Sử dụng quy trình của chúng tôi trong tìm kiếm dạng lưới
Điều chỉnh siêu tham số (các biến xác định cấu trúc mạng giống như các đơn vị ẩn) có thể tẻ nhạt và mệt mỏi.
Một cách để đánh giá mô hình có thể là thay đổi kích thước của tập huấn luyện và đánh giá hiệu suất.
Bạn có thể lặp lại phương pháp này mười lần để xem số liệu về điểm số. Tuy nhiên, có quá nhiều công việc.
Thay vào đó, scikit-learn cung cấp chức năng thực hiện điều chỉnh tham số và xác thực chéo.
Xác thực chéo
Xác thực chéo có nghĩa là trong quá trình đào tạo, tập huấn luyện được trượt n lần trong các lần gấp và sau đó đánh giá mô hình n lần. Ví dụ: nếu cv được đặt thành 10, tập huấn luyện sẽ được huấn luyện và đánh giá mười lần. Ở mỗi vòng, bộ phân loại chọn ngẫu nhiên chín lần để huấn luyện mô hình và lần thứ 10 dùng để đánh giá.
Tìm kiếm lưới
Mỗi bộ phân loại có siêu tham số để điều chỉnh. Bạn có thể thử các giá trị khác nhau hoặc bạn có thể đặt lưới tham số. Nếu truy cập trang web chính thức của scikit-learn, bạn có thể thấy bộ phân loại logistic có các thông số khác nhau để điều chỉnh. Để quá trình đào tạo nhanh hơn, bạn chọn điều chỉnh tham số C. Nó kiểm soát tham số chính quy. Nó phải tích cực. Một giá trị nhỏ mang lại nhiều trọng lượng hơn cho bộ điều chỉnh.
Bạn có thể sử dụng đối tượng GridSearchCV. Bạn cần tạo một từ điển chứa các siêu tham số để điều chỉnh.
Bạn liệt kê các siêu tham số theo sau là các giá trị bạn muốn thử. Chẳng hạn, để điều chỉnh tham số C, bạn sử dụng:
- ' logisticregression__C': [0.1, 1.0, 1.0]: Tham số được đặt trước tên, viết thường, của bộ phân loại và hai dấu gạch dưới.
Mô hình sẽ thử bốn giá trị khác nhau: 0.001, 0.01, 0.1 và 1.
Bạn huấn luyện mô hình bằng cách sử dụng 10 lần: cv=10
from sklearn.model_selection import GridSearchCV # Construct the parameter grid param_grid = { 'logisticregression__C': [0.001, 0.01,0.1, 1.0], }
Bạn có thể huấn luyện mô hình bằng GridSearchCV với tham số gr và cv.
# Train the model grid_clf = GridSearchCV(model, param_grid, cv=10, iid=False) grid_clf.fit(X_train, y_train)
OUTPUT
GridSearchCV(cv=10, error_score='raise-deprecating', estimator=Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,...ty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False))]), fit_params=None, iid=False, n_jobs=1, param_grid={'logisticregression__C': [0.001, 0.01, 0.1, 1.0]}, pre_dispatch='2*n_jobs', refit=True, return_train_score='warn', scoring=None, verbose=0)
Để truy cập các thông số tốt nhất, bạn sử dụng best_params_
grid_clf.best_params_
OUTPUT
{'logisticregression__C': 1.0}
Sau khi huấn luyện mô hình với bốn giá trị chính quy khác nhau, tham số tối ưu là
print("best logistic regression from grid search: %f" % grid_clf.best_estimator_.score(X_test, y_test))
hồi quy logistic tốt nhất từ tìm kiếm dạng lưới: 0.850891
Để truy cập các xác suất dự đoán:
grid_clf.best_estimator_.predict_proba(X_test)
array([[0.83576677, 0.16423323], [0.9458291 , 0.0541709 ], [0.64760416, 0.35239584], ..., [0.99639224, 0.00360776], [0.02072033, 0.97927967], [0.56782222, 0.43217778]])
Mô hình XGBoost với scikit-learn
Hãy thử các ví dụ về Scikit-learn để đào tạo một trong những trình phân loại tốt nhất trên thị trường. XGBoost là một cải tiến so với rừng ngẫu nhiên. Nền tảng lý thuyết của bộ phân loại nằm ngoài phạm vi của điều này Python Hướng dẫn Scikit. Hãy nhớ rằng, XGBoost đã giành chiến thắng trong nhiều cuộc thi kaggle. Với kích thước tập dữ liệu trung bình, nó có thể hoạt động tốt như thuật toán học sâu hoặc thậm chí tốt hơn.
Việc huấn luyện bộ phân loại là một thách thức vì nó có nhiều tham số cần điều chỉnh. Tất nhiên, bạn có thể sử dụng GridSearchCV để chọn tham số cho mình.
Thay vào đó, hãy xem cách sử dụng một cách tốt hơn để tìm các thông số tối ưu. GridSearchCV có thể tẻ nhạt và mất nhiều thời gian đào tạo nếu bạn truyền nhiều giá trị. Không gian tìm kiếm tăng lên cùng với số lượng tham số. Giải pháp thích hợp hơn là sử dụng RandomizedSearchCV. Phương pháp này bao gồm việc chọn các giá trị của mỗi siêu tham số sau mỗi lần lặp ngẫu nhiên. Ví dụ: nếu bộ phân loại được huấn luyện qua 1000 lần lặp thì 1000 kết hợp sẽ được đánh giá. Nó hoạt động ít nhiều giống như vậy. LướiTìm kiếmCV
Bạn cần nhập xgboost. Nếu thư viện chưa được cài đặt, vui lòng sử dụng pip3 install xgboost hoặc
use import sys !{sys.executable} -m pip install xgboost
In Jupyter môi trường
Tiếp theo,
import xgboost from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import StratifiedKFold
Bước tiếp theo trong Scikit này Python hướng dẫn bao gồm việc chỉ định các tham số để điều chỉnh. Bạn có thể tham khảo tài liệu chính thức để xem tất cả các thông số cần điều chỉnh. Vì lợi ích của Python Hướng dẫn Sklearn, bạn chỉ chọn hai siêu tham số, mỗi siêu tham số có hai giá trị. XGBoost mất rất nhiều thời gian để đào tạo, càng có nhiều siêu tham số trong lưới thì thời gian chờ đợi càng lâu.
params = { 'xgbclassifier__gamma': [0.5, 1], 'xgbclassifier__max_depth': [3, 4] }
Bạn xây dựng một quy trình mới bằng trình phân loại XGBoost. Bạn chọn xác định 600 công cụ ước tính. Lưu ý rằng n_estimators là một tham số mà bạn có thể điều chỉnh. Giá trị cao có thể dẫn đến trang bị quá mức. Bạn có thể tự mình thử các giá trị khác nhau nhưng lưu ý rằng việc này có thể mất hàng giờ. Bạn sử dụng giá trị mặc định cho các tham số khác
model_xgb = make_pipeline( preprocess, xgboost.XGBClassifier( n_estimators=600, objective='binary:logistic', silent=True, nthread=1) )
Bạn có thể cải thiện việc xác thực chéo bằng trình xác thực chéo Stratified K-Folds. Bạn chỉ xây dựng ba lần ở đây để tính toán nhanh hơn nhưng giảm chất lượng. Hãy tăng giá trị này lên 5 hoặc 10 ở nhà để cải thiện kết quả.
Bạn chọn huấn luyện mô hình qua bốn lần lặp.
skf = StratifiedKFold(n_splits=3, shuffle = True, random_state = 1001) random_search = RandomizedSearchCV(model_xgb, param_distributions=params, n_iter=4, scoring='accuracy', n_jobs=4, cv=skf.split(X_train, y_train), verbose=3, random_state=1001)
Tìm kiếm ngẫu nhiên đã sẵn sàng để sử dụng, bạn có thể huấn luyện mô hình
#grid_xgb = GridSearchCV(model_xgb, params, cv=10, iid=False) random_search.fit(X_train, y_train)
Fitting 3 folds for each of 4 candidates, totalling 12 fits [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8759645283888057, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8729701715996775, total= 1.0min [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8706519235199263, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8735460094437406, total= 1.3min [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8722791661868018, total= 57.7s [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8753886905447426, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8697304768486523, total= 1.3min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8740066797189912, total= 1.4min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8707671043538355, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8729701715996775, total= 1.2min [Parallel(n_jobs=4)]: Done 10 out of 12 | elapsed: 3.6min remaining: 43.5s [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8736611770125533, total= 1.2min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8692697535130154, total= 1.2min
[Parallel(n_jobs=4)]: Done 12 out of 12 | elapsed: 3.6min finished /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/model_selection/_search.py:737: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal. DeprecationWarning)
RandomizedSearchCV(cv=<generator object _BaseKFold.split at 0x1101eb830>, error_score='raise-deprecating', estimator=Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,... reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1))]), fit_params=None, iid='warn', n_iter=4, n_jobs=4, param_distributions={'xgbclassifier__gamma': [0.5, 1], 'xgbclassifier__max_depth': [3, 4]}, pre_dispatch='2*n_jobs', random_state=1001, refit=True, return_train_score='warn', scoring='accuracy', verbose=3)
Như bạn có thể thấy, XGBoost có điểm tốt hơn so với hồi quy logisitc trước đó.
print("Best parameter", random_search.best_params_) print("best logistic regression from grid search: %f" % random_search.best_estimator_.score(X_test, y_test))
Best parameter {'xgbclassifier__max_depth': 3, 'xgbclassifier__gamma': 0.5} best logistic regression from grid search: 0.873157
random_search.best_estimator_.predict(X_test)
array(['<=50K', '<=50K', '<=50K', ..., '<=50K', '>50K', '<=50K'], dtype=object)
Tạo DNN với MLPClassifier trong scikit-learn
Cuối cùng, bạn có thể huấn luyện thuật toán deep learning bằng scikit-learn. Phương pháp này giống như các phân loại khác. Trình phân loại có sẵn tại MLPClassifier.
from sklearn.neural_network import MLPClassifier
Bạn định nghĩa thuật toán học sâu sau đây:
- Người giải quyết Adam
- Chức năng kích hoạt Relu
- Alpha = 0.0001
- cỡ lô 150
- Hai lớp ẩn lần lượt có 100 và 50 nơ-ron
model_dnn = make_pipeline( preprocess, MLPClassifier(solver='adam', alpha=0.0001, activation='relu', batch_size=150, hidden_layer_sizes=(200, 100), random_state=1))
Bạn có thể thay đổi số lớp để cải thiện mô hình
model_dnn.fit(X_train, y_train) print("DNN regression score: %f" % model_dnn.score(X_test, y_test))
Điểm hồi quy DNN: 0.821253
LIME: Hãy tin tưởng vào Mô hình của bạn
Bây giờ bạn đã có một mô hình tốt, bạn cần một công cụ để tin tưởng vào nó. học máy Thuật toán, đặc biệt là rừng ngẫu nhiên và mạng nơ-ron, được biết đến là thuật toán hộp đen. Nói cách khác, nó hoạt động nhưng không ai biết tại sao.
Ba nhà nghiên cứu đã nghĩ ra một công cụ tuyệt vời để xem máy tính đưa ra dự đoán như thế nào. Bài báo có tên Tại sao tôi nên tin tưởng bạn?
Họ đã phát triển một thuật toán có tên Giải thích bất khả tri về mô hình có thể diễn giải cục bộ (LIME).
Lấy một ví dụ:
đôi khi bạn không biết liệu mình có thể tin tưởng vào dự đoán của máy học hay không:
Ví dụ, một bác sĩ không thể tin tưởng vào kết quả chẩn đoán chỉ vì máy tính nói như vậy. Bạn cũng cần biết liệu bạn có thể tin tưởng vào mô hình hay không trước khi đưa nó vào sản xuất.
Hãy tưởng tượng chúng ta có thể hiểu tại sao bất kỳ bộ phân loại nào cũng đưa ra dự đoán, ngay cả những mô hình cực kỳ phức tạp như mạng thần kinh, rừng ngẫu nhiên hoặc Svms với bất kỳ hạt nhân nào
sẽ dễ dàng tin vào một dự đoán hơn nếu chúng ta có thể hiểu lý do đằng sau nó. Từ ví dụ với bác sĩ, nếu người mẫu nói với anh ta những triệu chứng nào là quan trọng mà bạn sẽ tin tưởng, thì bạn cũng sẽ dễ dàng nhận ra liệu bạn có nên không tin tưởng vào mô hình hay không.
Lime có thể cho bạn biết những đặc điểm nào ảnh hưởng đến quyết định của bộ phân loại
Chuẩn bị dữ liệu
Đó là một số thứ bạn cần thay đổi để chạy LIME mãng xà. Trước hết, bạn cần cài đặt vôi trong thiết bị đầu cuối. Bạn có thể sử dụng pip cài đặt vôi
Lime sử dụng đối tượng LimeTabularExplainer để ước tính mô hình cục bộ. Đối tượng này yêu cầu:
- một tập dữ liệu ở định dạng gọn gàng
- Tên của các tính năng: feature_names
- Tên các lớp: class_names
- Chỉ mục của cột của các tính năng phân loại: categorical_features
- Tên của nhóm cho từng tính năng phân loại: categorical_names
Tạo bộ tàu numpy
Bạn có thể sao chép và chuyển đổi df_train từ gấu trúc sang cục mịch rất dễ dàng
df_train.head(5) # Create numpy data df_lime = df_train df_lime.head(3)
Lấy tên lớp Nhãn có thể truy cập được bằng đối tượng duy nhất(). Bạn nên thấy:
- '<=50K'
- '>50K'
# Get the class name class_names = df_lime.label.unique() class_names
array(['<=50K', '>50K'], dtype=object)
chỉ mục của cột các tính năng phân loại
Bạn có thể sử dụng phương pháp mà bạn đã dựa trước đó để lấy tên của nhóm. Bạn mã hóa nhãn bằng LabelEncode. Bạn lặp lại thao tác trên tất cả các tính năng được phân loại.
## import sklearn.preprocessing as preprocessing categorical_names = {} for feature in CATE_FEATURES: le = preprocessing.LabelEncoder() le.fit(df_lime[feature]) df_lime[feature] = le.transform(df_lime[feature]) categorical_names[feature] = le.classes_ print(categorical_names)
{'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th', 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad', 'Masters', 'Preschool', 'Prof-school', 'Some-college'], dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse', 'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'], dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct', 'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support', 'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras', 'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico', 'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'], dtype=object)} df_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 label object dtype: object
Bây giờ tập dữ liệu đã sẵn sàng, bạn có thể xây dựng tập dữ liệu khác như trong các ví dụ tìm hiểu Scikit bên dưới. Bạn thực sự chuyển đổi dữ liệu bên ngoài quy trình để tránh lỗi với LIME. Tập huấn luyện trong LimeTabularExplainer phải là một mảng gọn gàng không có chuỗi. Với phương pháp trên, bạn đã chuyển đổi tập dữ liệu huấn luyện.
from sklearn.model_selection import train_test_split X_train_lime, X_test_lime, y_train_lime, y_test_lime = train_test_split(df_lime[features], df_lime.label, test_size = 0.2, random_state=0) X_train_lime.head(5)
Bạn có thể tạo đường dẫn với các tham số tối ưu từ XGBoost
model_xgb = make_pipeline( preprocess, xgboost.XGBClassifier(max_depth = 3, gamma = 0.5, n_estimators=600, objective='binary:logistic', silent=True, nthread=1)) model_xgb.fit(X_train_lime, y_train_lime)
/Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py:351: FutureWarning: The handling of integer data will change in version 0.22. Currently, the categories are determined based on the range [0, max(values)], while in the future they will be determined based on the unique values. If you want the future behavior and silence this warning, you can specify "categories='auto'."In case you used a LabelEncoder before this OneHotEncoder to convert the categories to integers, then you can now use the OneHotEncoder directly. warnings.warn(msg, FutureWarning)
Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,... reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1))])
Bạn nhận được cảnh báo. Cảnh báo giải thích rằng bạn không cần tạo bộ mã hóa nhãn trước pipeline. Nếu bạn không muốn sử dụng LIME, bạn có thể sử dụng phương pháp từ phần đầu tiên của hướng dẫn Machine Learning with Scikit-learn. Nếu không, bạn có thể tiếp tục với phương pháp này, trước tiên hãy tạo một tập dữ liệu được mã hóa, thiết lập bộ mã hóa hot one trong pipeline.
print("best logistic regression from grid search: %f" % model_xgb.score(X_test_lime, y_test_lime))
best logistic regression from grid search: 0.873157
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01], [9.5173013e-01, 4.8269872e-02], [7.9344827e-01, 2.0655173e-01], ..., [9.9031430e-01, 9.6856682e-03], [6.4581633e-04, 9.9935418e-01], [9.7104281e-01, 2.8957171e-02]], dtype=float32)
Trước khi sử dụng LIME trong thực tế, hãy tạo một mảng numpy với các tính năng phân loại sai. Bạn có thể sử dụng danh sách đó sau để biết điều gì làm sai lệch bộ phân loại.
temp = pd.concat([X_test_lime, y_test_lime], axis= 1) temp['predicted'] = model_xgb.predict(X_test_lime) temp['wrong']= temp['label'] != temp['predicted'] temp = temp.query('wrong==True').drop('wrong', axis=1) temp= temp.sort_values(by=['label']) temp.shape
(826, 16)
Bạn tạo hàm lambda để truy xuất dự đoán từ mô hình với dữ liệu mới. Bạn sẽ cần nó sớm.
predict_fn = lambda x: model_xgb.predict_proba(x).astype(float) X_test_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 dtype: object
predict_fn(X_test_lime)
array([[7.96461046e-01, 2.03538969e-01], [9.51730132e-01, 4.82698716e-02], [7.93448269e-01, 2.06551731e-01], ..., [9.90314305e-01, 9.68566816e-03], [6.45816326e-04, 9.99354184e-01], [9.71042812e-01, 2.89571714e-02]])
Bạn chuyển đổi khung dữ liệu gấu trúc thành mảng có nhiều mảng
X_train_lime = X_train_lime.values X_test_lime = X_test_lime.values X_test_lime
array([[4.00000e+01, 5.00000e+00, 1.93524e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], [2.70000e+01, 4.00000e+00, 2.16481e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], [2.50000e+01, 4.00000e+00, 2.56263e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], ..., [2.80000e+01, 6.00000e+00, 2.11032e+05, ..., 0.00000e+00, 4.00000e+01, 2.50000e+01], [4.40000e+01, 4.00000e+00, 1.67005e+05, ..., 0.00000e+00, 6.00000e+01, 3.80000e+01], [5.30000e+01, 4.00000e+00, 2.57940e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01]])
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01], [9.5173013e-01, 4.8269872e-02], [7.9344827e-01, 2.0655173e-01], ..., [9.9031430e-01, 9.6856682e-03], [6.4581633e-04, 9.9935418e-01], [9.7104281e-01, 2.8957171e-02]], dtype=float32)
print(features, class_names, categorical_features, categorical_names)
['age', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] ['<=50K' '>50K'] [1, 3, 5, 6, 7, 8, 9, 13] {'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th', 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad', 'Masters', 'Preschool', 'Prof-school', 'Some-college'], dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse', 'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'], dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct', 'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support', 'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras', 'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico', 'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'], dtype=object)}
import lime import lime.lime_tabular ### Train should be label encoded not one hot encoded explainer = lime.lime_tabular.LimeTabularExplainer(X_train_lime , feature_names = features, class_names=class_names, categorical_features=categorical_features, categorical_names=categorical_names, kernel_width=3)
Hãy chọn một hộ gia đình ngẫu nhiên từ tập thử nghiệm và xem dự đoán của mô hình cũng như cách máy tính đưa ra lựa chọn của mình.
import numpy as np np.random.seed(1) i = 100 print(y_test_lime.iloc[i]) >50K
X_test_lime[i]
array([4.20000e+01, 4.00000e+00, 1.76286e+05, 7.00000e+00, 1.20000e+01, 2.00000e+00, 4.00000e+00, 0.00000e+00, 4.00000e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00, 4.00000e+01, 3.80000e+01])
Bạn có thể sử dụng trình giải thích với giải thích_instance để kiểm tra lời giải thích đằng sau mô hình
exp = explainer.explain_instance(X_test_lime[i], predict_fn, num_features=6) exp.show_in_notebook(show_all=False)
Chúng ta có thể thấy rằng bộ phân loại đã dự đoán chính xác hộ gia đình. Thu nhập thực sự là trên 50k.
Điều đầu tiên chúng ta có thể nói là bộ phân loại không chắc chắn về xác suất dự đoán. Máy dự đoán hộ gia đình có thu nhập trên 50k với xác suất 64%. 64% này được tạo thành từ việc tăng vốn và hôn nhân. Màu xanh đóng góp tiêu cực vào lớp dương và đường màu cam là tích cực.
Bộ phân loại bị nhầm lẫn vì mức tăng vốn của hộ gia đình này là không, trong khi mức tăng vốn thường là một yếu tố dự báo tốt về sự giàu có. Ngoài ra, hộ gia đình làm việc ít hơn 40 giờ mỗi tuần. Tuổi tác, nghề nghiệp và giới tính đóng góp tích cực cho việc phân loại.
Nếu tình trạng hôn nhân là độc thân, bộ phân loại sẽ dự đoán thu nhập dưới 50 nghìn (0.64-0.18 = 0.46)
Chúng ta có thể thử với một hộ gia đình khác đã bị phân loại sai
temp.head(3) temp.iloc[1,:-2]
age 58 workclass 4 fnlwgt 68624 education 11 education_num 9 marital 2 occupation 4 relationship 0 race 4 sex 1 capital_gain 0 capital_loss 0 hours_week 45 native_country 38 Name: 20931, dtype: object
i = 1 print('This observation is', temp.iloc[i,-2:])
This observation is label <=50K predicted >50K Name: 20931, dtype: object
exp = explainer.explain_instance(temp.iloc[1,:-2], predict_fn, num_features=6) exp.show_in_notebook(show_all=False)
Trình phân loại dự đoán thu nhập dưới 50 nghìn trong khi điều đó không đúng sự thật. Gia đình này có vẻ kỳ quặc. Nó không có lãi vốn, cũng không mất vốn. Ông ấy đã ly hôn và 60 tuổi, là người có học thức, tức là có trình độ học vấn_num > 12. Theo mô hình tổng thể, hộ gia đình này, như được người phân loại giải thích, sẽ có thu nhập dưới 50 nghìn.
Bạn cố gắng chơi đùa với LIME. Bạn sẽ nhận thấy những sai lầm nghiêm trọng từ bộ phân loại.
Bạn có thể kiểm tra GitHub của chủ sở hữu thư viện. Họ cung cấp thêm tài liệu để phân loại hình ảnh và văn bản.
Tổng kết
Dưới đây là danh sách một số lệnh hữu ích với phiên bản scikit learn >=0.20
tạo tập dữ liệu đào tạo/kiểm tra | thực tập sinh chia |
Xây dựng một đường ống | |
chọn cột và áp dụng phép biến đổi | biến áp cột |
kiểu chuyển đổi | |
tiêu chuẩn hóa | Tiêu chuẩn |
nhỏ nhất lớn nhất | Bộ chia tỷ lệ tối thiểu |
Bình thường hóa | Bộ chuẩn hóa |
Gán giá trị bị thiếu | máy tính |
Chuyển đổi phân loại | Bộ mã hóa OneHot |
Phù hợp và chuyển đổi dữ liệu | fit_transform |
Làm đường ống | make_pipeline |
Mô hình cơ bản | |
hồi quy logistic | Hậu cần |
XGBoost | Trình phân loại XGB |
Mạng thần kinh | Bộ phân loại MLP |
Tìm kiếm lưới | LướiTìm kiếmCV |
Tìm kiếm ngẫu nhiên | Tìm kiếm ngẫu nhiênCV |