前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROC曲线

ROC曲线

作者头像
用户3577892
发布2020-06-23 10:51:04
1.5K0
发布2020-06-23 10:51:04
举报
文章被收录于专栏:数据科学CLUB

关键词

  • 随机森林分类器
  • 5折交叉验证
  • ROC曲线
  • AUC
  • 可视化
代码语言:javascript
复制
import matplotlib.pylab as plt
from scipy import interp
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve,auc
from sklearn.model_selection import StratifiedKFold
import matplotlib.patches as patches
import numpy as np 
import pandas as pd 
代码语言:javascript
复制
# 导入数据,查看特征名称,标签数量和数据信息
data = pd .read_csv('./voice.csv')
print(data.columns)
label_value_count = data.label.value_counts()
print(label_value_count)
print(data.info())
代码语言:javascript
复制
Index(['meanfreq', 'sd', 'median', 'Q25', 'Q75', 'IQR', 'skew', 'kurt',
       'sp.ent', 'sfm', 'mode', 'centroid', 'meanfun', 'minfun', 'maxfun',
       'meandom', 'mindom', 'maxdom', 'dfrange', 'modindx', 'label'],
      dtype='object')
male      
female    
Name: label, dtype: int64
<class 'pandas.core.frame.DataFrame'>
RangeIndex:  entries,  to 
Data columns (total  columns):
meanfreq     non-null float64
sd           non-null float64
median       non-null float64
Q25          non-null float64
Q75          non-null float64
IQR          non-null float64
skew         non-null float64
kurt         non-null float64
sp.ent       non-null float64
sfm          non-null float64
mode         non-null float64
centroid     non-null float64
meanfun      non-null float64
minfun       non-null float64
maxfun       non-null float64
meandom      non-null float64
mindom       non-null float64
maxdom       non-null float64
dfrange      non-null float64
modindx      non-null float64
label        non-null object
dtypes: float64(), object()
memory usage: 519.9+ KB
None

可以看到label变量是对象(字符型),所以我们需要将它转换成数值型

代码语言:javascript
复制
# 转换规则 : male = 1, female = 0
dict = {'label':{'male':,'female':}}     
data.replace(dict,inplace = True)           
x = data.loc[:, data.columns != 'label']
y = data.loc[:,'label']
  • 创建随机森林分类器并进行五折交叉验证
  • 在k重交叉验证中,会将数据集划分为k个子集,重复k次。每次k子集中的一个子集用于测试集,而其他子集用于训练集。然后计算所有k个试验的平均准确度。
代码语言:javascript
复制
random_state = np.random.RandomState()
clf = RandomForestClassifier(random_state=random_state)
cv = StratifiedKFold(n_splits=,shuffle=False)
  • 在ROC曲线中,x轴是假阳性率,y轴是真阳性率
  • 如果曲线图中的曲线靠近左上角则测试更准确。
  • Roc曲线得分高低取决于auc,即预测得分曲线下的计算区域
  • 我们希望auc越接近于1,这代表预测结果越精确
代码语言:javascript
复制
fig1 = plt.figure(figsize=[,])
ax1 = fig1.add_subplot(,aspect = 'equal')
ax1.add_patch(
    patches.Arrow(0.45,0.5,-0.25,0.25,width=0.3,color='green',alpha = 0.5)
    )
ax1.add_patch(
    patches.Arrow(0.5,0.45,0.25,-0.25,width=0.3,color='red',alpha = 0.5)
    )

tprs = []
aucs = []
mean_fpr = np.linspace(,,)
i = 
for train,test in cv.split(x,y):
    prediction = clf.fit(x.iloc[train],y.iloc[train]).predict_proba(x.iloc[test])
    fpr, tpr, t = roc_curve(y[test], prediction[:, ])
    tprs.append(interp(mean_fpr, fpr, tpr))
    roc_auc = auc(fpr, tpr)
    aucs.append(roc_auc)
    plt.plot(fpr, tpr, lw=, alpha=0.3, label='ROC fold %d (AUC = %0.2f)' % (i, roc_auc))
    i= i+

plt.plot([,],[,],linestyle = '--',lw = ,color = 'black')
mean_tpr = np.mean(tprs, axis=)
mean_auc = auc(mean_fpr, mean_tpr)
plt.plot(mean_fpr, mean_tpr, color='blue',
         label=r'Mean ROC (AUC = %0.2f )' % (mean_auc),lw=, alpha=)

plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC')
plt.legend(loc="lower right")
plt.text(0.32,0.7,'More accurate area',fontsize = )
plt.text(0.63,0.4,'Less accurate area',fontsize = )
plt.show()

在本例中,ROC用于二分类。ROC主要用于二进制类,实际上也可以用于多分类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键词
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档