本次应用到的数据集为企业运营评估数据集 course-10-company.csv
,总共有 250
条数据,每条数据包括 6 个特征值,分别为:
industrial_risk
: 产业风险management_risk
: 管理风险finacial_flexibility
: 资金灵活性credibility
: 信用度competitiveness
: 竞争力operating_risk
: 操作风险其中,每条特征值包括 3
个等级,分别为:
Positive
: 好Average
: 中Negative
: 坏3
个等级分别用 P
, A
, N
代替。
通过这些特征对该企业是否会破产进行分类预测,其中:
NB
: 表示不会破产B
: 表示会破产加载好数据集之后,为了实现朴素贝叶斯算法,同样我们需要将数据集分为 训练集和测试集,依照经验:训练集占比为 70%,测试集占 30%。
同样在此我们使用 scikit-learn
模块的 train_test_split
函数完成数据集切分。
from sklearn.model_selection import train_test_split
x_train,x_test, y_train, y_test =train_test_split(train_data,train_target,test_size=0.4, random_state=0)
其中:
x_train
,x_test
, y_train
, y_test
分别表示,切分后的特征的训练集,特征的测试集,标签的训练集,标签的测试集;其中特征和标签的值是一一对应的。train_data
,train_target
分别表示为待划分的特征集和待划分的标签集。test_size
:测试样本所占比例。random_state
:随机数种子,在需要重复实验时,保证在随机数种子一样时能得到一组一样的随机数。# 导入数据集
# !wget -nc http://labfile.oss.aliyuncs.com/courses/1081/course-10-company.csv
import pandas as pd
enterprise_data = pd.read_csv('course-10-company.csv')
enterprise_data.head()
enterprise_data = enterprise_data.replace(
{"P": 1, "A": 2, "N": 3, "NB": 0, "B": 1}) # 对元素值进行替换
enterprise_data
"""数据集划分
"""
from sklearn.model_selection import train_test_split
# 得到企业运营评估数据集中 feature 的全部序列: industrial_risk, management_risk 等特征
feature_data = enterprise_data.iloc[:, :-1]
label_data = enterprise_data["label"] # 得到企业运营评估数据集中 label 的序列
x_train, x_test, y_train, y_test = train_test_split(
feature_data, label_data, test_size=0.3, random_state=4)
x_test # 输出企业运营评估数据测试集查看
数据集表现出离散型的特征。所以,根据上文中提到的模型选择经验,这里选用多项式模型。在前面的实验中我们采用 python
对朴素贝叶斯算法进行实现,下面我们通过 scikit-learn
来对其进行实现。
在 scikit-learn
朴素贝叶斯类及参数如下:
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
其中:
alpha
表示平滑参数,如拉普拉斯平滑则 alpha=1
。fit_prior
表示是否使用先验概率,默认为 True
。class_prior
表示类的先验概率。常用方法:
fit(x,y)
选择合适的贝叶斯分类器。predict(X)
对数据集进行预测返回预测结果。"""利用 scikit-learn 构建多项式朴素贝叶斯分类器
"""
from sklearn.naive_bayes import MultinomialNB
def sk_classfy(x_train, y_train, x_test):
sk_clf = MultinomialNB(alpha=1.0, fit_prior=True) # 定义多项式模型分类器
sk_clf.fit(x_train, y_train) # 进行模型训练
return sk_clf.predict(x_test)
y_predict = sk_classfy(x_train, y_train, x_test)
y_predict
当我们训练好模型并进行分类预测之后,可以通过比对预测结果和真实结果得到预测的准确率。
(11) a c c u r = ∑ i = 1 N I ( y i ˉ = y i ) N accur=\frac{\sum_{i=1}^{N}I(\bar{y_{i}}=y_{i})}{N}\tag{11} accur=N∑i=1NI(yiˉ=yi)(11)
公式(11)中 N N N 表示数据总条数, y i ˉ \bar{y_{i}} yiˉ 表示第 i i i 条数据的种类预测值, y i y_{i} yi 表示第 i i i 条数据的种类真实值, I I I 同样是指示函数,表示 y i ˉ \bar{y_{i}} yiˉ 和 y i y_{i} yi 相同的个数。
"""准确率计算
"""
def get_accuracy(test_labels, pred_labels):
correct = np.sum(test_labels == pred_labels) # 计算预测正确的数据个数
n = len(test_labels) # 总测试集数据个数
accur = correct/n
return accur
get_accuracy(y_test, y_predict)