虚拟分类器解释:初学者视觉指南

2024年08月21日 由 alex 发表 148 0

你是否曾想过数据科学家如何衡量机器学习模型的性能?虚拟分类器是数据科学世界中一个简单而强大的工具。把它想象成游戏中的基准玩家,为其他更复杂的模型设定最低标准。


定义

虚拟分类器是一种简单的机器学习模型,它使用基本规则进行预测,而不真正从输入数据中学习。它是比较更复杂模型性能的基准。虚拟分类器可以帮助我们了解复杂的模型是真的在学习有用的模式,还是只是在猜测。


2


数据集和库

在本文中,我们将以这个简单的人工高尔夫数据集为例。该数据集根据天气条件预测一个人是否会打高尔夫。它包括前景、温度、湿度和风力等特征,目标变量是是否打高尔夫球。


3


# Import libraries
from sklearn.model_selection import train_test_split
import pandas as pd
# Make a dataset
dataset_dict = {
    'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny', 'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny', 'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
    'Temperature': [85.0, 80.0, 83.0, 70.0, 68.0, 65.0, 64.0, 72.0, 69.0, 75.0, 75.0, 72.0, 81.0, 71.0, 81.0, 74.0, 76.0, 78.0, 82.0, 67.0, 85.0, 73.0, 88.0, 77.0, 79.0, 80.0, 66.0, 84.0],
    'Humidity': [85.0, 90.0, 78.0, 96.0, 80.0, 70.0, 65.0, 95.0, 70.0, 80.0, 70.0, 90.0, 75.0, 80.0, 88.0, 92.0, 85.0, 75.0, 92.0, 90.0, 85.0, 88.0, 65.0, 70.0, 60.0, 95.0, 70.0, 78.0],
    'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False, True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
    'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(dataset_dict)
# One-hot Encode 'Outlook' Column
df = pd.get_dummies(df, columns=['Outlook'],  prefix='', prefix_sep='', dtype=int)
# Convert 'Windy' (bool) and 'Play' (binary) Columns to 0 and 1
df['Wind'] = df['Wind'].astype(int)
df['Play'] = (df['Play'] == 'Yes').astype(int)
# Set feature matrix X and target vector y
X, y = df.drop(columns='Play'), df['Play']
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=False)


主要机制

虚拟分类器采用简单的策略进行预测。这些策略不涉及任何实际的数据学习。相反,它们使用的基本规则包括

  1. 总是预测最常见的类别
  2. 根据训练集的类别分布随机预测类别
  3. 总是预测特定类别


4


训练步骤

虚拟分类器的 “训练 ”过程非常简单,不涉及常规的学习算法。下面是一个大纲:


1. 选择策略

从以下策略中选择一种:

  • 分层: 根据原始类别分布进行随机猜测。
  • 最常见: 总是选择最常见的类别。
  • 统一: 随机选择任何类别。


5


from sklearn.dummy import DummyClassifier
# Choose a strategy for your DummyClassifier (e.g., 'most_frequent', 'stratified', etc.)
strategy = 'most_frequent'


2. 收集训练标签

从训练数据集中收集类别标签,以确定策略参数。


6


# Initialize the DummyClassifier
dummy_clf = DummyClassifier(strategy=strategy)
# "Train" the DummyClassifier (although no real training happens)
dummy_clf.fit(X_train, y_train)


3. 将策略应用于测试数据

使用所选策略为测试数据生成预测标签列表。


7


# Use the DummyClassifier to make predictions
y_pred = dummy_clf.predict(X_test)
print("Label     :",list(y_test))
print("Prediction:",list(y_pred))


评估模型


8


# Evaluate the DummyClassifier's accuracy
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test, y_pred)
print(f"Dummy Classifier Accuracy: {accuracy.round(4)*100}%")


关键参数

虚拟分类器虽然简单,但也有几个重要参数:

1. 策略: 这决定了分类器如何进行预测。常见选项包括

- most_frequent"(最常见): 总是预测训练集中最常见的类别。

- stratified: 根据训练集中的类别分布生成预测。

- uniform: 以随机方式统一生成预测结果: 均匀随机生成预测结果。

- constan: 始终预测指定类别。


2. 随机状态: 如果使用涉及随机性的策略(如 “分层 ”或 “均匀”),该参数可确保结果的可重复性。


3. 常量:使用 “常量 ”策略时,该参数指定了始终预测的类别。


9


优点与缺点

与其他机器学习工具一样,虚拟分类器也有其优点和局限性。


优点:

  1. 简单: 易于理解和实施。
  2. 基准性能: 为其他模型提供最低性能基准。
  3. 过拟合检查: 通过将复杂模型的性能与假分类器进行比较,帮助识别模型是否过度拟合。
  4. 快速训练和预测: 只需极少的计算资源。


缺点:

  1. 预测能力有限:根据设计,它不能从数据中学习,因此预测结果往往不准确。
  2. 不重视特征: 它无法深入了解哪些特征对预测最重要。
  3. 不适合复杂问题: 在具有复杂模式的真实世界场景中,虚拟分类器过于简单,无法单独发挥作用。


总结

了解虚假分类器对于任何数据科学家或机器学习爱好者来说都至关重要。它们可以作为现实检查,帮助我们确保更复杂的模型能够真正从数据中学习到有用的模式。


虚拟分类器代码汇总


# Import necessary libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.dummy import DummyClassifier
# Make dataset
dataset_dict = {
    'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny', 'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny', 'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
    'Temperature': [85.0, 80.0, 83.0, 70.0, 68.0, 65.0, 64.0, 72.0, 69.0, 75.0, 75.0, 72.0, 81.0, 71.0, 81.0, 74.0, 76.0, 78.0, 82.0, 67.0, 85.0, 73.0, 88.0, 77.0, 79.0, 80.0, 66.0, 84.0],
    'Humidity': [85.0, 90.0, 78.0, 96.0, 80.0, 70.0, 65.0, 95.0, 70.0, 80.0, 70.0, 90.0, 75.0, 80.0, 88.0, 92.0, 85.0, 75.0, 92.0, 90.0, 85.0, 88.0, 65.0, 70.0, 60.0, 95.0, 70.0, 78.0],
    'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False, True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
    'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(dataset_dict)
# Perform one-hot encoding on 'Outlook' column
df = pd.get_dummies(df, columns=['Outlook'], prefix='', prefix_sep='', dtype=int)
# Convert 'Wind' and 'Play' columns to binary indicators
df['Wind'] = df['Wind'].astype(int)
df['Play'] = (df['Play'] == 'Yes').astype(int)
# Split data into features (X) and target (y), then into training and test sets
X, y = df.drop(columns='Play'), df['Play']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=False)
# Initialize and train the dummy classifier model
dummy_clf = DummyClassifier(strategy='most_frequent')
dummy_clf.fit(X_train, y_train)
# Make predictions on the test data
y_pred = dummy_clf.predict(X_test)
# Calculate and print the model's accuracy on the test data
print(f"Accuracy: {accuracy_score(y_test, y_pred)*100:.4f}%")


文章来源:https://medium.com/towards-data-science/dummy-classifier-explained-a-visual-guide-with-code-examples-for-beginners-009ff95fc86e
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消