[ad_1]
Bởi vì chúng tôi đang sử dụng thuật toán học không giám sát nên không có thước đo chính xác nào được phổ biến rộng rãi. Tuy nhiên, chúng tôi có thể sử dụng kiến thức về miền để xác thực nhóm của mình.
Kiểm tra các nhóm một cách trực quan, chúng ta có thể thấy một số nhóm điểm chuẩn có sự kết hợp giữa khách sạn Phổ thông và Cao cấp, điều này không có ý nghĩa kinh doanh vì nhu cầu về khách sạn về cơ bản là khác nhau.
Chúng ta có thể cuộn đến dữ liệu và lưu ý một số khác biệt đó, nhưng liệu chúng ta có thể đưa ra thước đo độ chính xác của riêng mình không?
Chúng tôi muốn tạo một hàm để đo lường tính nhất quán của các bộ Điểm chuẩn được đề xuất trên từng tính năng. Một cách để làm điều này là tính toán phương sai trong từng đặc điểm của từng bộ. Đối với mỗi cụm, chúng tôi có thể tính giá trị trung bình của từng phương sai đặc điểm và sau đó chúng tôi có thể tính trung bình phương sai của từng cụm khách sạn để có được tổng điểm mô hình.
Từ kiến thức về miền của mình, chúng tôi biết rằng để thiết lập bộ điểm chuẩn có thể so sánh, chúng tôi cần ưu tiên các khách sạn trong cùng một Thương hiệu, có thể là cùng một thị trường và cùng một quốc gia và nếu chúng tôi sử dụng các thị trường hoặc quốc gia khác nhau thì thị trường bậc phải giống nhau.
Với ý nghĩ đó, chúng tôi muốn thước đo của mình có mức phạt cao hơn đối với sự khác biệt trong các tính năng đó. Để làm như vậy, chúng tôi sẽ sử dụng mức trung bình có trọng số để tính toán từng phương sai được đặt điểm chuẩn. Chúng tôi cũng sẽ in riêng biệt các tính năng chính và tính năng phụ.
Tóm lại, để tạo ra thước đo độ chính xác, chúng ta cần:
- Tính toán phương sai cho các biến phân loại: Một cách tiếp cận phổ biến là sử dụng thước đo “dựa trên entropy”, trong đó tính đa dạng cao hơn trong các danh mục biểu thị entropy (phương sai) cao hơn.
- Tính phương sai cho các biến số: chúng ta có thể tính độ lệch chuẩn hoặc phạm vi (chênh lệch giữa giá trị tối đa và tối thiểu). Điều này đo lường sự lan truyền của dữ liệu số trong mỗi cụm.
- Chuẩn hóa dữ liệu: bình thường hóa điểm phương sai cho từng danh mục trước khi áp dụng trọng số để đảm bảo rằng không có tính năng đơn lẻ nào chiếm ưu thế so với mức trung bình có trọng số chỉ do sự khác biệt về tỷ lệ.
- Áp dụng trọng số cho các số liệu khác nhau: Cân nhắc từng loại phương sai dựa trên tầm quan trọng của nó đối với logic phân cụm.
- Tính trung bình có trọng số: Tính trung bình có trọng số của các điểm phương sai này cho mỗi cụm.
- Tổng hợp điểm số giữa các cụm: Tổng số điểm là trung bình của các điểm phương sai có trọng số này trên tất cả các cụm hoặc hàng. Điểm trung bình thấp hơn sẽ cho thấy mô hình của chúng tôi nhóm các khách sạn tương tự lại với nhau một cách hiệu quả, giảm thiểu sự khác biệt trong cụm.
from scipy.stats import entropy
from sklearn.preprocessing import MinMaxScaler
from collections import Counterdef categorical_variance(knowledge):
"""
Calculate entropy for a categorical variable from an inventory.
A better entropy worth signifies datas with numerous courses.
A decrease entropy worth signifies a extra homogeneous subset of information.
"""
# Rely frequency of every distinctive worth
value_counts = Counter(knowledge)
total_count = sum(value_counts.values())
possibilities = (depend / total_count for depend in value_counts.values())
return entropy(possibilities)
#set scoring weights giving greater weights to an important options
scoring_weights = {"BRAND": 0.3,
"Room_count": 0.025,
"Market": 0.25,
"Nation": 0.15,
"Market Tier": 0.15,
"HCLASS": 0.05,
"Demand": 0.025,
"Worth vary": 0.025,
"distance_to_airport": 0.025}
def calculate_weighted_variance(df, weights):
"""
Calculate the weighted variance rating for clusters within the dataset
"""
# Initialize a DataFrame to retailer the variances
variance_df = pd.DataFrame()
# 1. Calculate variances for numerical options
numerical_features = ('Room_count', 'Demand', 'Worth vary', 'distance_to_airport')
for characteristic in numerical_features:
variance_df(f'{characteristic}') = df(characteristic).apply(np.var)
# 2. Calculate entropy for categorical options
categorical_features = ('BRAND', 'Market','Nation','Market Tier','HCLASS')
for characteristic in categorical_features:
variance_df(f'{characteristic}') = df(characteristic).apply(categorical_variance)
# 3. Normalize the variance and entropy values
scaler = MinMaxScaler()
normalized_variances = pd.DataFrame(scaler.fit_transform(variance_df),
columns=variance_df.columns,
index=variance_df.index)
# 4. Compute weighted common
cat_weights = {f'{characteristic}': weights(f'{characteristic}') for characteristic in categorical_features}
num_weights = {f'{characteristic}': weights(f'{characteristic}') for characteristic in numerical_features}
cat_weighted_scores = normalized_variances(categorical_features).mul(cat_weights)
df('cat_weighted_variance_score') = cat_weighted_scores.sum(axis=1)
num_weighted_scores = normalized_variances(numerical_features).mul(num_weights)
df('num_weighted_variance_score') = num_weighted_scores.sum(axis=1)
return df('cat_weighted_variance_score').imply(), df('num_weighted_variance_score').imply()
Để giữ cho mã của chúng tôi sạch sẽ và theo dõi các thử nghiệm của chúng tôi, hãy xác định một hàm để lưu trữ kết quả thử nghiệm của chúng tôi.
# outline a operate to retailer the outcomes of our experiments
def model_score(knowledge: pd.DataFrame,
weights: dict = scoring_weights,
model_name: str ="model_0"):
cat_score,num_score = calculate_weighted_variance(knowledge,weights)
outcomes ={"Mannequin": model_name,
"Main options rating": cat_score,
"Secondary options rating": num_score}
return outcomesmodel_0_score= model_score(results_model_0,scoring_weights)
model_0_score
Bây giờ chúng ta đã có đường cơ sở, hãy xem liệu chúng ta có thể cải thiện mô hình của mình hay không.
Cải thiện mô hình của chúng tôi thông qua thử nghiệm
Cho đến bây giờ, chúng tôi không cần phải biết điều gì đang diễn ra khi chúng tôi chạy mã này:
nns = NearestNeighbors()
nns.match(data_scaled)
nns_results_model_0 = nns.kneighbors(data_scaled)(1)
Để cải thiện mô hình của mình, chúng tôi sẽ cần hiểu các tham số của mô hình và cách chúng tôi có thể tương tác với chúng để có được bộ điểm chuẩn tốt hơn.
Hãy bắt đầu bằng cách xem tài liệu và mã nguồn của Scikit Be taught:
# the beneath is taken straight from scikit study supplyfrom sklearn.neighbors._base import KNeighborsMixin, NeighborsBase, RadiusNeighborsMixin
class NearestNeighbors_(KNeighborsMixin, RadiusNeighborsMixin, NeighborsBase):
"""Unsupervised learner for implementing neighbor searches.
Parameters
----------
n_neighbors : int, default=5
Variety of neighbors to make use of by default for :meth:`kneighbors` queries.
radius : float, default=1.0
Vary of parameter house to make use of by default for :meth:`radius_neighbors`
queries.
algorithm : {'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto'
Algorithm used to compute the closest neighbors:
- 'ball_tree' will use :class:`BallTree`
- 'kd_tree' will use :class:`KDTree`
- 'brute' will use a brute-force search.
- 'auto' will try and determine probably the most applicable algorithm
primarily based on the values handed to :meth:`match` technique.
Be aware: becoming on sparse enter will override the setting of
this parameter, utilizing brute drive.
leaf_size : int, default=30
Leaf dimension handed to BallTree or KDTree. This may have an effect on the
pace of the development and question, in addition to the reminiscence
required to retailer the tree. The optimum worth is determined by the
nature of the issue.
metric : str or callable, default='minkowski'
Metric to make use of for distance computation. Default is "minkowski", which
ends in the usual Euclidean distance when p = 2. See the
documentation of `scipy.spatial.distance
`_ and
the metrics listed in
:class:`~sklearn.metrics.pairwise.distance_metrics` for legitimate metric
values.
p : float (constructive), default=2
Parameter for the Minkowski metric from
sklearn.metrics.pairwise.pairwise_distances. When p = 1, that is
equal to utilizing manhattan_distance (l1), and euclidean_distance
(l2) for p = 2. For arbitrary p, minkowski_distance (l_p) is used.
metric_params : dict, default=None
Extra key phrase arguments for the metric operate.
"""
def __init__(
self,
*,
n_neighbors=5,
radius=1.0,
algorithm="auto",
leaf_size=30,
metric="minkowski",
p=2,
metric_params=None,
n_jobs=None,
):
tremendous().__init__(
n_neighbors=n_neighbors,
radius=radius,
algorithm=algorithm,
leaf_size=leaf_size,
metric=metric,
p=p,
metric_params=metric_params,
n_jobs=n_jobs,
)
Có khá nhiều điều đang diễn ra ở đây.
Các Nearestneighbor
lớp kế thừa từNeighborsBase
, đây là lớp trường hợp cho các công cụ ước tính lân cận gần nhất. Lớp này xử lý các chức năng chung cần thiết cho việc tìm kiếm lân cận gần nhất, chẳng hạn như
- n_neighbors (số lượng láng giềng sử dụng)
- bán kính (bán kính để tìm kiếm hàng xóm dựa trên bán kính)
- thuật toán (thuật toán được sử dụng để tính toán các lân cận gần nhất, chẳng hạn như ‘ball_tree’, ‘kd_tree’ hoặc ‘brute’)
- số liệu (số liệu khoảng cách sẽ sử dụng)
- metric_params (đối số từ khóa bổ sung cho hàm số liệu)
Các Nearestneighbor
lớp cũng kế thừa từKNeighborsMixin
Và RadiusNeighborsMixin
các lớp học. Các lớp Mixin này thêm các chức năng tìm kiếm hàng xóm cụ thể vào Nearestneighbor
KNeighborsMixin
cung cấp chức năng tìm số okay cố định gần nhất của hàng xóm tới một điểm. Nó thực hiện điều đó bằng cách tìm khoảng cách đến các điểm lân cận và chỉ số của chúng, đồng thời xây dựng biểu đồ kết nối giữa các điểm dựa trên okay điểm lân cận gần nhất của mỗi điểm.RadiusNeighborsMixin
dựa trên thuật toán lân cận bán kính, tìm tất cả lân cận trong bán kính nhất định của một điểm. Phương pháp này hữu ích trong các tình huống tập trung vào việc nắm bắt tất cả các điểm trong ngưỡng khoảng cách có ý nghĩa thay vì một số điểm cố định.
Dựa trên kịch bản của chúng tôi, KNeighborsMixin cung cấp chức năng mà chúng tôi cần.
Chúng ta cần hiểu một tham số chính trước khi có thể cải thiện mô hình của mình; đây là thước đo khoảng cách.
Tài liệu đề cập rằng thuật toán NearestNeighbor sử dụng khoảng cách “Minkowski” theo mặc định và cung cấp cho chúng tôi tham chiếu đến API SciPy.
TRONG scipy.spatial.distance
chúng ta có thể thấy hai biểu diễn toán học của khoảng cách “Minkowski”:
∥u−v∥ p=( i ∑∣ui−vi∣ p ) 1/p
Công thức này tính toán căn bậc p của tổng chênh lệch lũy thừa giữa tất cả các phần tử.
Biểu diễn toán học thứ hai của khoảng cách “Minkowski” là:
∥u−v∥ p=( i ∑wi(∣ui−vi∣ p )) 1/p
Điều này rất giống với điều đầu tiên, nhưng nó giới thiệu trọng số wi
đến những khác biệt, nhấn mạnh hoặc không nhấn mạnh những khía cạnh cụ thể. Điều này hữu ích khi một số tính năng nhất định có liên quan hơn những tính năng khác. Theo mặc định, cài đặt là Không, điều này mang lại cho tất cả các tính năng có cùng trọng số là 1,0.
Đây là một tùy chọn tuyệt vời để cải thiện mô hình của chúng tôi vì nó cho phép chúng tôi chuyển kiến thức về miền sang mô hình của mình và nhấn mạnh những điểm tương đồng phù hợp nhất với người dùng.
Nếu chúng ta nhìn vào công thức, chúng ta sẽ thấy tham số. p
. Tham số này ảnh hưởng đến “đường dẫn” mà thuật toán sử dụng để tính khoảng cách. Theo mặc định, p=2, đại diện cho khoảng cách Euclidian.
Bạn có thể coi khoảng cách Euclidian là phép tính khoảng cách bằng cách vẽ một đường thẳng nối 2 điểm. Đây thường là khoảng cách ngắn nhất, tuy nhiên, đây không phải lúc nào cũng là cách tính khoảng cách mong muốn nhất, đặc biệt trong các không gian có kích thước cao hơn. Để biết thêm thông tin về lý do tại sao lại như vậy, có bài viết tuyệt vời này trực tuyến: https://bib.dbvis.de/uploadedFiles/155.pdf
Một giá trị chung khác của p là 1. Giá trị này thể hiện khoảng cách Manhattan. Bạn nghĩ về nó như khoảng cách giữa hai điểm được đo dọc theo một đường dẫn dạng lưới.
Mặt khác, nếu chúng ta tăng p lên vô cùng, chúng ta sẽ thu được khoảng cách Chebyshev, được định nghĩa là chênh lệch tuyệt đối tối đa giữa bất kỳ phần tử tương ứng nào của vectơ. Về cơ bản, nó đo lường sự khác biệt trong trường hợp xấu nhất, giúp nó hữu ích trong các tình huống mà bạn muốn đảm bảo rằng không có tính năng nào thay đổi quá nhiều.
Bằng cách đọc và làm quen với tài liệu, chúng tôi đã phát hiện ra một số tùy chọn khả thi để cải thiện mô hình của mình.
Theo mặc định, n_neighbors là 5, tuy nhiên, đối với bộ điểm chuẩn của chúng tôi, chúng tôi muốn so sánh từng khách sạn với 3 khách sạn giống nhau nhất. Để làm như vậy, chúng ta cần đặt n_neighbors = 4 (Chủ đề khách sạn + 3 người ngang hàng)
nns_1= NearestNeighbors(n_neighbors=4)
nns_1.match(data_scaled)
nns_1_results_model_1 = nns_1.kneighbors(data_scaled)(1)
results_model_1 = clean_results(nns_results=nns_1_results_model_1,
encoders=encoders,
knowledge=data_clean)
model_1_score= model_score(results_model_1,scoring_weights,model_name="baseline_k_4")
model_1_score
Dựa trên tài liệu, chúng tôi có thể chuyển trọng số vào tính toán khoảng cách để nhấn mạnh mối quan hệ giữa một số đối tượng địa lý. Dựa trên kiến thức về miền của mình, chúng tôi đã xác định các tính năng mà chúng tôi muốn nhấn mạnh, trong trường hợp này là Thương hiệu, Thị trường, Quốc gia và Cấp thị trường.
# arrange weights for distance calculation
weights_dict = {"BRAND": 5,
"Room_count": 2,
"Market": 4,
"Nation": 3,
"Market Tier": 3,
"HCLASS": 1.5,
"Demand": 1,
"Worth vary": 1,
"distance_to_airport": 1}
# Rework the wieghts dictionnary into an inventory by preserving the scaled knowledge column order
weights = ( weights_dict(idx) for idx in record(scaler.get_feature_names_out()))nns_2= NearestNeighbors(n_neighbors=4,metric_params={ 'w': weights})
nns_2.match(data_scaled)
nns_2_results_model_2 = nns_2.kneighbors(data_scaled)(1)
results_model_2 = clean_results(nns_results=nns_2_results_model_2,
encoders=encoders,
knowledge=data_clean)
model_2_score= model_score(results_model_2,scoring_weights,model_name="baseline_with_weights")
model_2_score
Việc truyền kiến thức miền cho mô hình thông qua các trọng số đã tăng điểm đáng kể. Tiếp theo, hãy kiểm tra tác động của thước đo khoảng cách.
Cho đến nay, chúng ta đã sử dụng khoảng cách Euclidian. Hãy xem điều gì sẽ xảy ra nếu chúng ta sử dụng khoảng cách Manhattan.
nns_3= NearestNeighbors(n_neighbors=4,p=1,metric_params={ 'w': weights})
nns_3.match(data_scaled)
nns_3_results_model_3 = nns_3.kneighbors(data_scaled)(1)
results_model_3 = clean_results(nns_results=nns_3_results_model_3,
encoders=encoders,
knowledge=data_clean)
model_3_score= model_score(results_model_3,scoring_weights,model_name="Manhattan_with_weights")
model_3_score
Giảm p xuống 1 dẫn đến một số cải tiến tốt. Hãy xem điều gì xảy ra khi p xấp xỉ vô cùng.
Để sử dụng khoảng cách Chebyshev, chúng tôi sẽ thay đổi tham số số liệu thành Chebyshev.
Số liệu Chebyshev sklearn mặc định không có tham số trọng số. Để giải quyết vấn đề này, chúng ta sẽ định nghĩa một tùy chỉnh weighted_chebyshev
Hệ mét.
# Outline the customized weighted Chebyshev distance operate
def weighted_chebyshev(u, v, w):
"""Calculate the weighted Chebyshev distance between two factors."""
return np.max(w * np.abs(u - v))nns_4 = NearestNeighbors(n_neighbors=4,metric=weighted_chebyshev,metric_params={ 'w': weights})
nns_4.match(data_scaled)
nns_4_results_model_4 = nns_4.kneighbors(data_scaled)(1)
results_model_4 = clean_results(nns_results=nns_4_results_model_4,
encoders=encoders,
knowledge=data_clean)
model_4_score= model_score(results_model_4,scoring_weights,model_name="Chebyshev_with_weights")
model_4_score
Chúng tôi đã cố gắng giảm điểm khác biệt của tính năng chính thông qua thử nghiệm.
Hãy hình dung kết quả.
results_df = pd.DataFrame((model_0_score,model_1_score,model_2_score,model_3_score,model_4_score)).set_index("Mannequin")
results_df.plot(variety='barh')
Sử dụng khoảng cách Manhattan với trọng số dường như mang lại bộ điểm chuẩn chính xác nhất theo nhu cầu của chúng tôi.
Bước cuối cùng trước khi triển khai các bộ điểm chuẩn sẽ là kiểm tra các bộ có điểm tính năng Chính cao nhất và xác định các bước cần thực hiện với chúng.
# Histogram of Main options rating
results_model_3("cat_weighted_variance_score").plot(variety="hist")
exceptions = results_model_3(results_model_3("cat_weighted_variance_score")>=0.4)print(f" There are {exceptions.form(0)} benchmark units with important variance throughout the first options")
18 trường hợp này sẽ cần được xem xét lại để đảm bảo các bộ tiêu chuẩn có liên quan.
Như bạn có thể thấy, với một vài dòng mã và một số hiểu biết về tìm kiếm Hàng xóm gần nhất, chúng tôi đã quản lý để đặt các bộ điểm chuẩn nội bộ. Giờ đây, chúng tôi có thể phân phối các tập hợp và bắt đầu đo lường KPI của khách sạn dựa trên các tập hợp tiêu chuẩn của họ.
Bạn không phải lúc nào cũng phải tập trung vào các phương pháp học máy tiên tiến nhất để mang lại giá trị. Rất thường xuyên, học máy đơn giản có thể mang lại giá trị lớn.
Một số thành quả dễ đạt được trong hoạt động kinh doanh của bạn mà bạn có thể dễ dàng giải quyết bằng Học máy là gì?
Ngân hàng thế giới. “Các chỉ số phát triển thế giới.” Truy cập ngày 11 tháng 6 năm 2024, từ https://datacatalog.worldbank.org/search/dataset/0038117
Aggarwal, CC, Hinneburg, A., & Keim, DA (nd). Về hành vi đáng ngạc nhiên của số liệu khoảng cách trong không gian nhiều chiều. Trung tâm Nghiên cứu IBM TJ Watson và Viện Khoa học Máy tính, Đại học Halle. Lấy ra từ https://bib.dbvis.de/uploadedFiles/155.pdf
Hướng dẫn sử dụng SciPy v1.10.1. scipy.spatial.distance.minkowski
. Truy cập ngày 11 tháng 6 năm 2024, từ https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.minkowski.html
GeekforGeeks. Công thức Haversine để tìm khoảng cách giữa hai điểm trên một mặt cầu. Truy cập ngày 11 tháng 6 năm 2024, từ https://www.geeksforgeeks.org/haversine-formula-to-find-distance-between-two-points-on-a-sphere/
scikit-tìm hiểu. Mô-đun hàng xóm. Truy cập ngày 11 tháng 6 năm 2024, từ https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors
[ad_2]
Source link