机器学习 - P值



在机器学习中,我们使用 P 值来检验零假设,即两个变量之间没有显著关系。例如,如果我们有一个房价数据集,并且想要确定房屋大小与其价格之间是否存在显著关系,我们可以使用 P 值来检验这个假设。

为了理解机器学习中 P 值的概念,我们首先需要理解零假设和备择假设的概念。零假设是假设两个变量之间没有显著关系,而备择假设则与零假设相反,它指出两个变量之间存在显著关系。

一旦我们定义了零假设和备择假设,我们就可以使用 P 值来检验假设的显著性。P 值是在零假设为真的前提下,获得观测结果或更极端结果的概率。

如果 P 值小于显著性水平(通常设置为 0.05),那么我们拒绝零假设并接受备择假设。这意味着两个变量之间存在显著关系。另一方面,如果 P 值大于显著性水平,那么我们不拒绝零假设,并得出结论认为两个变量之间没有显著关系。

Python 中 P 值的实现

Python 提供了几个用于统计分析和假设检验的库。最流行的统计分析库之一是 scipy 库。scipy 库提供了一个名为 ttest_ind() 的函数,可用于计算两个独立样本的 P 值。

为了演示机器学习中 p 值的实现,我们将使用 scikit-learn 提供的乳腺癌数据集。该数据集的目标是根据肿瘤的半径、纹理、周长、面积、光滑度、致密性、凹度和对称性等各种特征来预测乳腺肿瘤是恶性还是良性。

首先,我们将加载数据集并将其拆分为训练集和测试集:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

data = load_breast_cancer()
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

接下来,我们将使用 scikit-learn 中的 SelectKBest 类根据它们的 p 值选择前 k 个特征。在这里,我们将选择前 5 个特征:

from sklearn.feature_selection import SelectKBest, f_classif
k = 5
selector = SelectKBest(score_func=f_classif, k=k)
X_train_new = selector.fit_transform(X_train, y_train)
X_test_new = selector.transform(X_test)

SelectKBest 类采用评分函数作为输入来计算每个特征的 p 值。我们使用 f_classif 函数,它是每个特征与目标变量之间的 ANOVA F 值。k 参数指定要选择的顶级特征的数量。

在训练数据上拟合选择器后,我们使用 fit_transform() 方法转换数据以仅保留前 k 个特征。我们还使用 transform() 方法转换测试数据以仅保留选择的特征。

我们现在可以在选择的特征上训练模型并评估其性能:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

model = LogisticRegression()
model.fit(X_train_new, y_train)
y_pred = model.predict(X_test_new)

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

在这个例子中,我们在前 5 个选择的特征上训练了一个逻辑回归模型,并使用准确率评估了它的性能。但是,p 值也可以用于假设检验,以确定一个特征是否具有统计学意义。

例如,要检验平均半径特征是否显著的假设,我们可以使用 scipy.stats 模块中的 ttest_ind() 函数:

from scipy.stats import ttest_ind

malignant = X[y == 0, 0]
benign = X[y == 1, 0]
t, p_value = ttest_ind(malignant, benign)

print(f"P-value: {p_value:.2f}")

ttest_ind() 函数接收两个数组作为输入,并返回 t 统计量和双尾 p 值。

输出

我们将从上述实现中获得以下输出:

Accuracy: 0.97
P-value: 0.00

在这个例子中,我们计算了恶性和良性类别之间平均半径特征的 p 值。

广告