赞
踩
朴素贝叶斯算法是机器学习中基于贝叶斯定理的一种分类方法。该方法实际上是一种生成模型,它通过分析数据中的各种属性之间的关系来确定不同分类的概率。在朴素贝叶斯算法中,我们先计算出每个分类的先验概率,然后通过给定的属性值计算每种分类的后验概率,最终选择拥有最高后验概率的分类作为其预测结果。
朴素贝叶斯算法中的“朴素”指的是假设每个属性/特征都是条件独立的,即每个属性对分类的影响是相互独立的,这样可以大大简化计算。
案例实战思路:
假设我们有一个垃圾邮件分类器系统,该系统需要能够自动识别哪些邮件是垃圾邮件。那么我们可以利用朴素贝叶斯算法来实现这一功能。首先,我们需要对数据进行预处理,将文本数据转换成类似于向量的形式,这样可以方便计算。接着,我们需要将数据集划分成训练集和测试集。
在训练集上,我们可以计算每个特征在不同分类下出现的概率,并计算不同分类的先验概率。这样,我们就可以得到一个分类模型,该模型可以在测试集上进行表现测试。我们可以将测试集中的每个邮件分别输入到模型中,该模型能够根据邮件的各项属性计算概率,从而预测该邮件的分类。
总的来说,朴素贝叶斯算法是一种比较简单易用的分类算法,其主要优点是计算速度快、准确率高,并且可以在大数据量下进行有效的处理。由于其基于简单的统计原理,所以其可持续性、简单性和可解释性都非常好。
代码部分:
- import pandas as pd
- from sklearn.feature_extraction.text import CountVectorizer
- from sklearn.naive_bayes import MultinomialNB
- from sklearn.metrics import accuracy_score
-
- # 1. 加载数据
- data = pd.read_csv('spam.csv', encoding='latin-1')
-
- # 2. 数据预处理
- data.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)
- data = data.rename(columns={'v1': 'label', 'v2': 'text'})
- data['label'] = data['label'].map({'ham': 0, 'spam': 1})
-
- # 3. 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(data['text'], data['label'], test_size=0.2, random_state=42)
-
- # 4. 特征提取
- vectorizer = CountVectorizer()
- X_train_counts = vectorizer.fit_transform(X_train)
- X_test_counts = vectorizer.transform(X_test)
-
- # 5. 训练分类器
- clf = MultinomialNB()
- clf.fit(X_train_counts, y_train)
-
- # 6. 预测
- y_pred = clf.predict(X_test_counts)
-
- # 7. 评估分类器性能
- acc_score = accuracy_score(y_test, y_pred)
- print('Accuracy:', acc_score)
这个案例的目的是建立一个垃圾邮件分类器,使用朴素贝叶斯算法对电子邮件进行分类。在这个案例中,我们首先需要加载数据,接着对数据进行预处理。预处理步骤包括将特定列重命名,将标签用数字表示,删除不需要的列等。然后,我们将数据集拆分成训练集和测试集。在这个案例中,我们将80%的数据用于训练,20%的数据用于测试。接下来,我们使用词袋模型提取特征。这里我们使用了 CountVectorizer 类,该类可以计算出每个单词出现的次数。然后,我们使用 MultinomialNB 类训练一个分类器。最后,我们使用分类器对测试集进行预测,并使用 accuracy_score 函数计算分类器的性能。在这个案例中,在测试集上的准确率约为 98%。
- # 8. 特征工程优化
- from sklearn.pipeline import Pipeline
-
- text_clf = Pipeline([
- ('vect', CountVectorizer()),
- ('clf', MultinomialNB())
- ])
- text_clf.fit(X_train, y_train)
-
- # 9. 交叉验证
- from sklearn.model_selection import cross_val_score
-
- scores = cross_val_score(text_clf, data['text'], data['label'], cv=5)
- print('5-fold cross-validation scores:', scores)
- print('Mean cross-validation score:', scores.mean())
-
- # 10. 模型优化
- from sklearn.model_selection import GridSearchCV
-
- parameters = {
- 'vect__ngram_range': [(1,1), (1,2)],
- 'vect__max_df': [0.75, 1.0],
- 'vect__min_df': [1, 2],
- 'clf__alpha': [0.1, 1, 10]
- }
- gs_clf = GridSearchCV(text_clf, parameters, cv=5)
- gs_clf.fit(data['text'], data['label'])
- print('Best parameters:', gs_clf.best_params_)
- print('Best score:', gs_clf.best_score_)
在这个后半段代码中,我们进行了特征工程的优化。首先,我们使用 Scikit-learn 的管道机制,将文本特征提取和分类器训练过程合并为一个步骤。这个管道包含两个步骤,即特征提取和分类器训练。我们还使用交叉验证来评估模型的性能。在这个案例中,我们使用了 5 折交叉验证。最后,我们对模型进行了优化,使用网格搜索(GridSearchCV)寻找最佳超参数组合。在这个案例中,我们要优化的参数包括词袋模型的 ngram_range、max_df 和 min_df 参数,以及朴素贝叶斯分类器的平滑参数 alpha。我们使用网格搜索找到最佳超参数组合,并输出最佳得分和参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。