我已经实现了Kfold-cross验证算法来研究机器学习问题并设置SVM的参数(我知道skilearn但我想自己执行算法)。我创建了5个折叠,我用它来测试SVM参数'C'和'tollerance'。 我将结果保存在一个文本文件中,然后我用这样的Pandas创建了一个Dataframe:
C tol FP TN SPE TP FN SEN
0 100 0.10000 19 261 0.9469 107 6 0.9321
1 100 0.10000 30 250 0.8319 94 19 0.8929
2 100 0.10000 28 252 0.8496 96 17 0.9000
3 100 0.10000 27 253 0.9735 110 3 0.9036
4 100 0.10000 26 254 0.9469 107 6 0.9071
5 100 0.05000 16 264 0.9381 106 7 0.9429
6 100 0.05000 22 258 0.8319 94 19 0.9214
7 100 0.05000 25 255 0.8761 99 14 0.9107
8 100 0.05000 21 259 0.9646 109 4 0.9250
9 100 0.05000 20 260 0.9823 111 2 0.9286
.......
400 1000000 0.00001 21 259 0.9558 108 5 0.9250
401 1000000 0.00001 20 260 0.8850 100 13 0.9286
402 1000000 0.00001 14 266 0.8584 97 16 0.9500
403 1000000 0.00001 17 263 0.9558 108 5 0.9393
404 1000000 0.00001 23 257 0.9735 110 3 0.9179
它有405行。 我需要计算“SPE”和“SEN”列中每组5个元素的平均值,然后在整个数据帧中迭代整个过程(例如,我需要计算列'SPE'元素的平均值在行0:4中的'SEN',而不是在5:9中,而不是在10:14 ......直到行400:404)。 对于每次迭代,我想获得一个具有以下值的矩阵:
['C', 'tol' , 'mean of SPE', 'mean of SEN']
矩阵将有405/5 = 81行和4列。
因此对于上面的Dataframe部分,我想要一个结果链接:
[[100, 0.10000, 0.90976, 0.90714],
[100,0.05000, 0.91860, 0.92572]]
.....
[1000000,0.00001,0.91860, 0.92572]
我想获得这个矩阵,因为我的目标是使用pyplot获得2个图:一个用于变量'SPE'对'tol',一个用于变量'SEN'对''tol'用于绘制每个值的不同曲线'C'。
感谢
答案 0 :(得分:1)
使用<div class="row" *ngIf="errors && errors.length">
<div class="col-md-12">
<div class="alert alert-danger alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
<ol *ngFor="let err of errMsg">
<li>{{ err }}</li>
</ol>
</div>
</div>
</div>
由{div}创建的arange
first
mean
和df = df.groupby(np.arange(len(df.index)) // 5) \
.agg({'C':'first', 'tol':'first', 'SPE':'mean','SEN':'mean'}) \
.reindex_axis(['C','tol','SPE','SEN'], axis=1) \
.rename(columns = {'SPE':'mean of SPE','SEN':'mean of SEN'})
print (df)
C tol mean of SPE mean of SEN
0 100 0.10000 0.90976 0.90714
1 100 0.05000 0.91860 0.92572
2 1000000 0.00001 0.92570 0.93216
,groupby
用于列的更改顺序:
df1 = df.pivot(index='mean of SPE', columns='tol', values='C')
print (df1)
tol 0.00001 0.05000 0.10000
mean of SPE
0.90976 NaN NaN 100.0
0.91860 NaN 100.0 NaN
0.92570 1000000.0 NaN NaN
可以使用agg
+ reindex_axis
:
df1 = df.pivot(index='C', columns='tol', values='mean of SPE')
print (df1)
tol 0.00001 0.05000 0.10000
C
100 NaN 0.9186 0.90976
1000000 0.9257 NaN NaN
df1.plot()
或者也许:
df = df.groupby(np.arange(len(df.index)) // 5) \
.agg({'C':'first', 'tol':'first', 'SPE':'mean','SEN':'mean'}) \
.reindex_axis(['C','tol','SPE','SEN'], axis=1) \
.values
print (df)
[[ 1.00000000e+02 1.00000000e-01 9.09760000e-01 9.07140000e-01]
[ 1.00000000e+02 5.00000000e-02 9.18600000e-01 9.25720000e-01]
[ 1.00000000e+06 1.00000000e-05 9.25700000e-01 9.32160000e-01]]
对于numpy数组添加pivot
:
df
编辑:
如果每5行的容差值是唯一的,groupby
的解决方案可能略有不同 - tol
列arange
而不是df = df.groupby('tol', sort=False) \
.agg({'C':'first', 'SPE':'mean','SEN':'mean'}) \
.reset_index() \
.reindex_axis(['C','tol','SPE','SEN'], axis=1) \
.rename(columns = {'SPE':'mean of SPE','SEN':'mean of SEN'})
print (df)
C tol mean of SPE mean of SEN
0 100 0.10000 0.90976 0.90714
1 100 0.05000 0.91860 0.92572
2 1000000 0.00001 0.92570 0.93216
:
ALTER TABLE