machine-learning - 为了使用NB分类器,特征何时独立?
问题描述
我正在使用分类模型,因为我是新手,所以我有一个问题。据说朴素贝叶斯在特征相互独立时表现良好。我如何知道我的功能集中的功能是否独立?有什么例子吗?谢谢!!
解决方案
特征的独立性
在大多数情况下,人们想要检查一个特征是否与另一个特征高度相关(甚至重复),以便可以省略其中一个。相关性为 1 意味着,如果省略相关特征之一,您不会丢失任何信息。有多种方法可以检查相关性,例如在Pythonnp.corrcoef
和.pd.DataFrame.corr
scipy.stats.pearsonr
但事情可能更复杂。如果您不能使用 featuresx_1, ..., x_n
来预测 feature ,则 features 是相互独立的x_n+1
。在大多数情况下,人们可能会检查特征是否彼此线性相关,这意味着:
x_n+1 = a_1 * x_1 + ... + a_n * x_n + error
如果是这种情况(并且误差贡献很小),人们可能会忽略依赖特征。请注意,因此您可以省略所有 - 特征中的任何一个n+1
,因为您可以重构您的方程以x_i
在 lhs 上有任何特征。要检查这一点,可能会计算特征值并检查接近零的值。
移除依赖特征
from sklearn import datasets
import numpy as np
from sklearn import decomposition
from sklearn import naive_bayes
from sklearn import model_selection
X, y = datasets.make_classification(n_samples=10000, n_features=10, n_repeated=0, n_informative=6, n_redundant=4, n_classes=2)
u, s, vh = np.linalg.svd(X)
#display s
s
array([8.06415389e+02, 6.69591201e+02, 4.31329281e+02, 4.02622029e+02,
2.85447317e+02, 2.53360358e+02, 4.07459972e-13, 2.55851809e-13,
1.72445591e-13, 6.68493846e-14])
所以基本上,4个功能是多余的。所以现在,我们可以使用诸如主成分分析或线性判别分析之类的特征减少技术将特征减少到只有 6 个。
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y)
gnb = naive_bayes.GaussianNB()
gnb.fit(X_train, y_train)
gnb.score(X_test, y_test) #results in 0.7216
现在我们将特征减少到 6 个。
pca = decomposition.PCA(n_components=6)
X_trafo = pca.fit_transform(X)
X_train, X_test, y_train, y_test = model_selection.train_test_split(X_trafo, y)
gnb.fit(X_train, y_train)
gnb.score(X_test, y_test) #results in 0.7216
请注意,这些值不需要完全相同。
推荐阅读
- android - 使用改造库时不调用 onResponse 方法
- winforms - 检测键组合 C# Winform
- javascript - Vue 大喊对象未定义,同时它在需要加载它的范围内
- asp.net-core - 优雅关闭:AppDomain.CurrentDomain.ProcessExit 与 appLifetime.ApplicationStopping.Register 有什么区别?
- javascript - Chrome:某些图表出现错误时,将 Highcharts 导出为 svg 格式
- javascript - Javascript 和数据库,特殊符号无法正确显示
- c - 如何将字符串切割成结构数组[C]?
- html - "-" 登录 svg 路径
- google-app-engine - 自动将 Github 提交到 Google AppEngine 版本
- wordpress - Woocommerce 中的邮政编码