在机器学习的广阔领域中,概率学习开辟了自己独特的空间。 在统计和概率的驱动下,概率学习侧重于对数据中存在的不确定性进行建模。 它提供了一个视角,强调大多数数据源固有的潜在随机性和可变性。
概率学习模型与确定性模型的不同之处在于,它们提供的预测是一组结果的概率分布,而不是单个确定的输出。 这种细致入微的方法具有巨大的价值,特别是在面临可用信息不完整、有噪音或不确定的情况时。
在本段,我们将全面了解概率学习的概念,探索其关键算法,然后通过朴素贝叶斯分类器的 Python 实践示例说明其实现。
概率学习是机器学习的一个子领域,其中算法根据可能结果的概率分布进行预测,而不是精确指出单个最可能的结果。 它提供了从决定论到不确定性的根本转变,一种更适合世界复杂而嘈杂的现实的观点。
想象一个场景,我们有一个患者数据集,我们想要预测他们是否患有某种特定疾病。 在确定性学习方法中,我们可以构建一个决策树,根据各种症状预测“是”或“否”。 然而,疾病和症状很少是二元的——没有症状并不一定意味着一个人没有疾病,而有症状并不能保证一定有病。
相反,概率学习模型将输出可能结果的概率分布。 例如,它可能会说这个人有 70% 的可能性患有这种疾病,而有 30% 的可能性没有。 这种概率输出为数据和预测提供了更丰富的视角,提供了模型不确定性的量化。
概率学习模型特点:
朴素贝叶斯分类器:
朴素贝叶斯分类器是基于贝叶斯定理的最直接、最强大的分类算法之一,并假设预测变量之间独立。 该模型易于构建,对于大型数据集特别有用。 尽管朴素贝叶斯很简单,但其性能优于更复杂的分类方法。 让我们使用 Python 从头开始创建一个朴素贝叶斯分类器,以便更好地理解其内部机制。
import numpy as np
import pandas as pd
# Set a seed so that the results are reproducible
np.random.seed(0)
# Number of samples per class
n_samples = 500
# Generate synthetic heights
male_heights = np.random.normal(5.855, 0.2, n_samples)
female_heights = np.random.normal(5.4175, 0.2, n_samples)
# Generate synthetic weights
male_weights = np.random.normal(176.25, 20, n_samples)
female_weights = np.random.normal(132.5, 20, n_samples)
# Generate synthetic foot sizes
male_foot_sizes = np.random.normal(11.25, 1, n_samples)
female_foot_sizes = np.random.normal(7.5, 1, n_samples)
# Create dataframes for each gender
male_df = pd.DataFrame({
'Height': male_heights,
'Weight': male_weights,
'Foot_Size': male_foot_sizes,
'Gender': 'male'
})
female_df = pd.DataFrame({
'Height': female_heights,
'Weight': female_weights,
'Foot_Size': female_foot_sizes,
'Gender': 'female'
})
# Means for male
male_height_mean = data_means['Height'][data_variance.index == 'male'].values[0]
male_weight_mean = data_means['Weight'][data_variance.index == 'male'].values[0]
male_footsize_mean = data_means['Foot_Size'][data_variance.index == 'male'].values[0]
# Variance for male
male_height_variance = data_variance['Height'][data_variance.index == 'male'].values[0]
male_weight_variance = data_variance['Weight'][data_variance.index == 'male'].values[0]
male_footsize_variance = data_variance['Foot_Size'][data_variance.index == 'male'].values[0]
# Means for female
female_height_mean = data_means['Height'][data_variance.index == 'female'].values[0]
female_weight_mean = data_means['Weight'][data_variance.index == 'female'].values[0]
female_footsize_mean = data_means['Foot_Size'][data_variance.index == 'female'].values[0]
# Variance for female
female_height_variance = data_variance['Height'][data_variance.index == 'female'].values[0]
female_weight_variance = data_variance['Weight'][data_variance.index == 'female'].values[0]
female_footsize_variance = data_variance['Foot_Size'][data_variance.index == 'female'].values[0]