你是否曾想过数据科学家如何衡量机器学习模型的性能?虚拟分类器是数据科学世界中一个简单而强大的工具。把它想象成游戏中的基准玩家,为其他更复杂的模型设定最低标准。
定义
虚拟分类器是一种简单的机器学习模型,它使用基本规则进行预测,而不真正从输入数据中学习。它是比较更复杂模型性能的基准。虚拟分类器可以帮助我们了解复杂的模型是真的在学习有用的模式,还是只是在猜测。
数据集和库
在本文中,我们将以这个简单的人工高尔夫数据集为例。该数据集根据天气条件预测一个人是否会打高尔夫。它包括前景、温度、湿度和风力等特征,目标变量是是否打高尔夫球。
# 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. 选择策略
从以下策略中选择一种:
from sklearn.dummy import DummyClassifier
# Choose a strategy for your DummyClassifier (e.g., 'most_frequent', 'stratified', etc.)
strategy = 'most_frequent'
2. 收集训练标签
从训练数据集中收集类别标签,以确定策略参数。
# Initialize the DummyClassifier
dummy_clf = DummyClassifier(strategy=strategy)
# "Train" the DummyClassifier (although no real training happens)
dummy_clf.fit(X_train, y_train)
3. 将策略应用于测试数据
使用所选策略为测试数据生成预测标签列表。
# Use the DummyClassifier to make predictions
y_pred = dummy_clf.predict(X_test)
print("Label :",list(y_test))
print("Prediction:",list(y_pred))
评估模型
# 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. 常量:使用 “常量 ”策略时,该参数指定了始终预测的类别。
优点与缺点
与其他机器学习工具一样,虚拟分类器也有其优点和局限性。
优点:
缺点:
总结
了解虚假分类器对于任何数据科学家或机器学习爱好者来说都至关重要。它们可以作为现实检查,帮助我们确保更复杂的模型能够真正从数据中学习到有用的模式。
虚拟分类器代码汇总
# 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}%")