fselector 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. data/README.md +13 -14
  2. data/lib/fselector.rb +5 -1
  3. data/lib/fselector/algo_base/base_continuous.rb +0 -2
  4. data/lib/fselector/algo_base/base_discrete.rb +1 -13
  5. data/lib/fselector/algo_continuous/PMetric.rb +5 -1
  6. data/lib/fselector/algo_continuous/TScore.rb +8 -1
  7. data/lib/fselector/algo_discrete/Accuracy.rb +5 -1
  8. data/lib/fselector/algo_discrete/AccuracyBalanced.rb +4 -1
  9. data/lib/fselector/algo_discrete/BiNormalSeparation.rb +7 -4
  10. data/lib/fselector/algo_discrete/ChiSquaredTest.rb +13 -9
  11. data/lib/fselector/algo_discrete/CorrelationCoefficient.rb +6 -3
  12. data/lib/fselector/algo_discrete/F1Measure.rb +4 -1
  13. data/lib/fselector/algo_discrete/GMean.rb +4 -1
  14. data/lib/fselector/algo_discrete/GSSCoefficient.rb +4 -1
  15. data/lib/fselector/algo_discrete/GiniIndex.rb +2 -1
  16. data/lib/fselector/algo_discrete/MatthewsCorrelationCoefficient.rb +5 -3
  17. data/lib/fselector/algo_discrete/McNemarsTest.rb +11 -8
  18. data/lib/fselector/algo_discrete/MutualInformation.rb +4 -1
  19. data/lib/fselector/algo_discrete/OddsRatio.rb +5 -2
  20. data/lib/fselector/algo_discrete/OddsRatioNumerator.rb +4 -1
  21. data/lib/fselector/algo_discrete/Power.rb +4 -1
  22. data/lib/fselector/algo_discrete/Precision.rb +4 -1
  23. data/lib/fselector/algo_discrete/ProbabilityRatio.rb +4 -1
  24. data/lib/fselector/algo_discrete/Sensitivity.rb +4 -1
  25. data/lib/fselector/algo_discrete/Specificity.rb +4 -1
  26. data/lib/fselector/{algo_continuous/discretizer.rb → discretizer.rb} +0 -0
  27. data/lib/fselector/{algo_continuous/normalizer.rb → normalizer.rb} +0 -0
  28. data/lib/fselector/replace_missing_values.rb +1 -1
  29. metadata +4 -4
data/README.md CHANGED
@@ -8,8 +8,8 @@ FSelector: a Ruby gem for feature selection and ranking
8
8
  **Email**: [need47@gmail.com](mailto:need47@gmail.com)
9
9
  **Copyright**: 2012
10
10
  **License**: MIT License
11
- **Latest Version**: 0.3.1
12
- **Release Date**: April 4 2012
11
+ **Latest Version**: 0.4.0
12
+ **Release Date**: April 5 2012
13
13
 
14
14
  Synopsis
15
15
  --------
@@ -101,7 +101,7 @@ Feature List
101
101
  algorithm note feature type
102
102
  --------------------------------------------------------------------------------------
103
103
  fixed_value replace with a fixed value discrete, continuous
104
- mean_value replace with the mean feature value continuous
104
+ mean_value replace with mean feature value continuous
105
105
  most_seen_value replace with most seen feature value discrete
106
106
 
107
107
  Installing
@@ -124,10 +124,10 @@ Usage
124
124
  # read from random data (or csv, libsvm, weka ARFF file)
125
125
  # no. of samples: 100
126
126
  # no. of classes: 2
127
- # no. of features: 10
127
+ # no. of features: 15
128
128
  # no. of possible values for each feature: 3
129
129
  # allow missing values: true
130
- r1.data_from_random(100, 2, 10, 3, true)
130
+ r1.data_from_random(100, 2, 15, 3, true)
131
131
 
132
132
  # number of features before feature selection
133
133
  puts "# features (before): "+ r1.get_features.size.to_s
@@ -141,7 +141,7 @@ Usage
141
141
  # you can also use multiple alogirithms in a tandem manner
142
142
  # e.g. use the ChiSquaredTest with Yates' continuity correction
143
143
  # initialize from r1's data
144
- r2 = FSelector::ChiSquaredTest.new(:yates, r1.get_data)
144
+ r2 = FSelector::ChiSquaredTest.new(:yates_continuity_correction, r1.get_data)
145
145
 
146
146
  # number of features before feature selection
147
147
  puts "# features (before): "+ r2.get_features.size.to_s
@@ -157,7 +157,7 @@ Usage
157
157
  r2.data_to_weka(:stdout, :sparse)
158
158
 
159
159
 
160
- **2. feature selection by an ensemble of algorithms**
160
+ **2. feature selection by an ensemble of multiple algorithms**
161
161
 
162
162
  require 'fselector'
163
163
 
@@ -169,7 +169,7 @@ Usage
169
169
  re = FSelector::Ensemble.new(r1, r2)
170
170
 
171
171
  # read random data
172
- re.data_from_random(100, 2, 10, 3, true)
172
+ re.data_from_random(100, 2, 15, 3, true)
173
173
 
174
174
  # number of features before feature selection
175
175
  puts '# features (before): ' + re.get_features.size.to_s
@@ -185,7 +185,7 @@ Usage
185
185
  puts '# features (after): ' + re.get_features.size.to_s
186
186
 
187
187
 
188
- **3. normalization and discretization before feature selection**
188
+ **3. normalization and discretization before feature selection**
189
189
 
190
190
  In addition to the algorithms designed for continuous feature, one
191
191
  can apply those deisgned for discrete feature after (optionally
@@ -194,14 +194,11 @@ Usage
194
194
  require 'fselector'
195
195
 
196
196
  # for continuous feature
197
- r1 = FSelector::BaseContinuous.new
197
+ r1 = FSelector::Relief_c.new
198
198
 
199
199
  # read the Iris data set (under the test/ directory)
200
200
  r1.data_from_csv('test/iris.csv')
201
-
202
- # normalization by log2 (optional)
203
- # r1.normalize_by_log!(2)
204
-
201
+
205
202
  # discretization by ChiMerge algorithm
206
203
  # chi-squared value = 4.60 for a three-class problem at alpha=0.10
207
204
  r1.discretize_by_ChiMerge!(4.60)
@@ -219,6 +216,8 @@ Usage
219
216
  # number of features after feature selection
220
217
  puts '# features (after): ' + r2.get_features.size.to_s
221
218
 
219
+ **4. see more examples test_*.rb under the test/ directory**
220
+
222
221
  Copyright
223
222
  ---------
224
223
  FSelector © 2012 by [Tiejun Cheng](mailto:need47@gmail.com).
data/lib/fselector.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  module FSelector
5
5
  # module version
6
- VERSION = '0.3.1'
6
+ VERSION = '0.4.0'
7
7
  end
8
8
 
9
9
  ROOT = File.expand_path(File.dirname(__FILE__))
@@ -17,6 +17,10 @@ require "#{ROOT}/fselector/fileio.rb"
17
17
  require "#{ROOT}/fselector/util.rb"
18
18
  # entropy-related functions
19
19
  require "#{ROOT}/fselector/entropy.rb"
20
+ # normalization for continuous data
21
+ require "#{ROOT}/fselector/normalizer.rb"
22
+ # discretization for continuous data
23
+ require "#{ROOT}/fselector/discretizer.rb"
20
24
  # replace missing values
21
25
  require "#{ROOT}/fselector/replace_missing_values.rb"
22
26
 
@@ -1,5 +1,3 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../algo_continuous/normalizer.rb')
2
- require File.expand_path(File.dirname(__FILE__) + '/../algo_continuous/discretizer.rb')
3
1
  #
4
2
  # FSelector: a Ruby gem for feature selection and ranking
5
3
  #
@@ -41,10 +41,7 @@ module FSelector
41
41
  def get_A(f, k)
42
42
  @A ||= calc_A
43
43
  a = @A[k][f]
44
-
45
- # add 0.5 to avoid any ZERO in denominator or numerator
46
- a+=0.5 if a.zero?
47
-
44
+
48
45
  a
49
46
  end # get_A
50
47
 
@@ -78,9 +75,6 @@ module FSelector
78
75
  def get_B(f, k)
79
76
  @B ||= calc_B
80
77
  b = @B[k][f]
81
-
82
- # add 0.5 to avoid any ZERO in denominator or numerator
83
- b+=0.5 if b.zero?
84
78
 
85
79
  b
86
80
  end # get_B
@@ -116,9 +110,6 @@ module FSelector
116
110
  @C ||= calc_C
117
111
  c = @C[k][f]
118
112
 
119
- # add 0.5 to avoid any ZERO in denominator or numerator
120
- c+=0.5 if c.zero?
121
-
122
113
  c
123
114
  end # get_C
124
115
 
@@ -153,9 +144,6 @@ module FSelector
153
144
  @D ||= calc_D
154
145
  d = @D[k][f]
155
146
 
156
- # add 0.5 to avoid any ZERO in denominator or numerator
157
- d+=0.5 if d.zero?
158
-
159
147
  d
160
148
  end # get_D
161
149
 
@@ -34,7 +34,11 @@ module FSelector
34
34
  end
35
35
 
36
36
  # calc
37
- s = (s1.ave-s2.ave).abs / (s1.sd+s2.sd)
37
+ s = 0.0
38
+ dd = s1.sd+s2.sd
39
+ if not dd.zero?
40
+ s = (s1.ave-s2.ave).abs / dd
41
+ end
38
42
 
39
43
  set_feature_score(f, :BEST, s)
40
44
  end # calc_contribution
@@ -35,7 +35,14 @@ module FSelector
35
35
 
36
36
  # calc
37
37
  n1, n2 = s1.size, s2.size
38
- s = (s1.ave-s2.ave).abs / Math.sqrt( (n1*s1.var+n2*s2.var) / (n1+n2) )
38
+ if not (n1+n2).zero?
39
+ dd = Math.sqrt( (n1*s1.var+n2*s2.var) / (n1+n2) )
40
+ end
41
+
42
+ s = 0.0
43
+ if not dd.zero?
44
+ s = (s1.ave-s2.ave).abs / dd
45
+ end
39
46
 
40
47
  set_feature_score(f, :BEST, s)
41
48
  end # calc_contribution
@@ -17,8 +17,12 @@ module FSelector
17
17
  def calc_contribution(f)
18
18
  each_class do |k|
19
19
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
20
+ n = a+b+c+d
20
21
 
21
- s = (a+d) / (a+b+c+d)
22
+ s = 0.0
23
+ if not n.zero?
24
+ s = (a+d) / n
25
+ end
22
26
 
23
27
  set_feature_score(f, k, s)
24
28
  end
@@ -18,7 +18,10 @@ module FSelector
18
18
  each_class do |k|
19
19
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
20
20
 
21
- s = (a/(a+c) - b/(b+d)).abs
21
+ s = 0.0
22
+ if not (a+c).zero? and not (b+d).zero?
23
+ s = (a/(a+c) - b/(b+d)).abs
24
+ end
22
25
 
23
26
  set_feature_score(f, k, s)
24
27
  end
@@ -7,8 +7,8 @@ module FSelector
7
7
  #
8
8
  # BNS = |F'(tpr) - F'(fpr)|
9
9
  #
10
- # where F' is normal inverse cumulative distribution function
11
- # R executable is required to calculate qnorm, i.e. F'(x)
10
+ # where F'(x) is normal inverse cumulative distribution function
11
+ # R equivalent: qnorm
12
12
  #
13
13
  # ref: [An extensive empirical study of feature selection metrics for text classification](http://dl.acm.org/citation.cfm?id=944974) and [Rubystats](http://rubystats.rubyforge.org)
14
14
  #
@@ -25,8 +25,11 @@ module FSelector
25
25
  each_class do |k|
26
26
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
27
27
 
28
- tpr, fpr = a/(a+c), b/(b+d)
29
- s = (@nd.get_icdf(tpr) - @nd.get_icdf(fpr)).abs
28
+ s = 0.0
29
+ if not (a+c).zero? and not (b+d).zero?
30
+ tpr, fpr = a/(a+c), b/(b+d)
31
+ s = (@nd.get_icdf(tpr) - @nd.get_icdf(fpr)).abs
32
+ end
30
33
 
31
34
  set_feature_score(f, k, s)
32
35
  end
@@ -22,12 +22,12 @@ module FSelector
22
22
  #
23
23
  # new()
24
24
  #
25
- # @param [Boolean] correction Yates's continuity correction
26
- # :yates, Yates's continuity correction
25
+ # @param [Boolean] correction Yates's continuity correction?
26
+ # no correction if nil, correction otherwise
27
27
  #
28
28
  def initialize(correction=nil, data=nil)
29
29
  super(data)
30
- @correction = (correction==:yates) ? true : false
30
+ @correction = (correction || false)
31
31
  end
32
32
 
33
33
 
@@ -44,12 +44,16 @@ module FSelector
44
44
  "Chi-squared approximation may be incorrect"
45
45
  end
46
46
 
47
- if not @correction
48
- s = n * ((a*d-b*c)**2) /
49
- (a+b) / (c+d) / (a+c) / (b+d)
50
- else
51
- s = n * (((a*d-b*c).abs - n/2))**2 /
52
- (a+b) / (c+d) / (a+c) / (b+d)
47
+ s = 0.0
48
+ if not (a+b).zero? and not (c+d).zero? and
49
+ not (a+c).zero? and not (b+d).zero?
50
+ if not @correction
51
+ s = n * ((a*d-b*c)**2) /
52
+ (a+b) / (c+d) / (a+c) / (b+d)
53
+ else
54
+ s = n * (((a*d-b*c).abs - n/2))**2 /
55
+ (a+b) / (c+d) / (a+c) / (b+d)
56
+ end
53
57
  end
54
58
 
55
59
  set_feature_score(f, k, s)
@@ -21,9 +21,12 @@ module FSelector
21
21
  each_class do |k|
22
22
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
23
23
  n = a+b+c+d
24
-
25
- s = Math.sqrt(n) * (a*d-b*c) /
26
- Math.sqrt( (a+b) * (c+d) * (a+c) * (b+d) )
24
+
25
+ s = 0.0
26
+ if not ((a+b)*(c+d)*(a+c)*(b+d)).zero?
27
+ s = Math.sqrt(n) * (a*d-b*c) /
28
+ Math.sqrt( (a+b) * (c+d) * (a+c) * (b+d) )
29
+ end
27
30
 
28
31
  set_feature_score(f, k, s)
29
32
  end
@@ -24,7 +24,10 @@ module FSelector
24
24
  each_class do |k|
25
25
  a, b, c = get_A(f, k), get_B(f, k), get_C(f, k)
26
26
 
27
- s = 2*a / (a+c+a+b)
27
+ s = 0.0
28
+ if not (a+c+a+b).zero?
29
+ s = 2*a / (a+c+a+b)
30
+ end
28
31
 
29
32
  set_feature_score(f, k, s)
30
33
  end
@@ -20,7 +20,10 @@ module FSelector
20
20
  each_class do |k|
21
21
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
22
22
 
23
- s = Math.sqrt( (a*d)/((a+c)*(b+d)) )
23
+ s = 0.0
24
+ if not ((a+c)*(b+d)).zero?
25
+ s = Math.sqrt( (a*d)/((a+c)*(b+d)) )
26
+ end
24
27
 
25
28
  set_feature_score(f, k, s)
26
29
  end
@@ -25,7 +25,10 @@ module FSelector
25
25
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
26
26
  n = a+b+c+d
27
27
 
28
- s = a/n * d/n - b/n * c/n
28
+ s = 0.0
29
+ if not n.zero?
30
+ s = a/n * d/n - b/n * c/n
31
+ end
29
32
 
30
33
  set_feature_score(f, k, s)
31
34
  end
@@ -22,11 +22,12 @@ module FSelector
22
22
 
23
23
  each_class do |k|
24
24
  a, b = get_A(f, k), get_B(f, k)
25
- s += (a/(a+b))**2
25
+ s += (a/(a+b))**2 if not (a+b).zero?
26
26
  end
27
27
 
28
28
  # note: we've intentionally negated it
29
29
  s = s-1
30
+ s = -0.5 if s.zero? # Gini(max) = 0.5
30
31
 
31
32
  set_feature_score(f, :BEST, s)
32
33
  end # calc_contribution
@@ -23,9 +23,11 @@ module FSelector
23
23
  def calc_contribution(f)
24
24
  each_class do |k|
25
25
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
26
- n = a+b+c+d
27
-
28
- s = (a*d-b*c) / Math.sqrt((a+b)*(a+c)*(b+d)*(c+d))
26
+
27
+ s = 0.0
28
+ if not ((a+b)*(a+c)*(b+d)*(c+d)).zero?
29
+ s = (a*d-b*c) / Math.sqrt((a+b)*(a+c)*(b+d)*(c+d))
30
+ end
29
31
 
30
32
  set_feature_score(f, k, s)
31
33
  end
@@ -2,10 +2,10 @@
2
2
  # FSelector: a Ruby gem for feature selection and ranking
3
3
  #
4
4
  module FSelector
5
- # McNemar's test (MN), based on Chi-Squared test
5
+ # McNemar's test (MNT), based on Chi-Squared test
6
6
  #
7
7
  # (B-C)^2
8
- # MN(f, c) = ---------
8
+ # MNT(f, c) = ---------
9
9
  # B+C
10
10
  #
11
11
  # suitable for large samples and B+C >= 25
@@ -16,8 +16,8 @@ module FSelector
16
16
  #
17
17
  # new()
18
18
  #
19
- # @param [Boolean] correction correction Yates's continuity correction
20
- # :yates, Yates's continuity correction
19
+ # @param [Boolean] correction Yates's continuity correction?
20
+ # no correction if nil, correction otherwise
21
21
  #
22
22
  def initialize(correction=nil, data=nil)
23
23
  super(data)
@@ -36,10 +36,13 @@ module FSelector
36
36
  "Chi-squared approximation may be incorrect"
37
37
  end
38
38
 
39
- if not @correction
40
- s = (b-c)**2 / (b+c)
41
- else
42
- s = ((b-c).abs-0.5)**2 / (b+c)
39
+ s = 0.0
40
+ if not (b+c).zero?
41
+ if not @correction
42
+ s = (b-c)**2 / (b+c)
43
+ else
44
+ s = ((b-c).abs-0.5)**2 / (b+c)
45
+ end
43
46
  end
44
47
 
45
48
  set_feature_score(f, k, s)
@@ -25,7 +25,10 @@ module FSelector
25
25
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
26
26
  n = a+b+c+d
27
27
 
28
- s = Math.log2(a*n/(a+b)/(a+c))
28
+ s = 0.0
29
+ if not ((a+b)*(a+c)).zero?
30
+ s = Math.log2(a*n/(a+b)/(a+c))
31
+ end
29
32
 
30
33
  set_feature_score(f, k, s)
31
34
  end
@@ -24,8 +24,11 @@ module FSelector
24
24
  each_class do |k|
25
25
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
26
26
 
27
- s = (a*d) / (b*c)
28
-
27
+ s = 0.0
28
+ if not (b*c).zero?
29
+ s = (a*d) / (b*c)
30
+ end
31
+
29
32
  set_feature_score(f, k, s)
30
33
  end
31
34
  end # calc_contribution
@@ -22,7 +22,10 @@ module FSelector
22
22
  each_class do |k|
23
23
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
24
24
 
25
- s = a*d/(a+c)/(b+d)
25
+ s = 0.0
26
+ if not ((a+c)*(b+d)).zero?
27
+ s = a*d/(a+c)/(b+d)
28
+ end
26
29
 
27
30
  set_feature_score(f, k, s)
28
31
  end
@@ -31,7 +31,10 @@ module FSelector
31
31
  each_class do |k|
32
32
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
33
33
 
34
- s = (d/(b+d))**(@k) - (c/(a+c))**(@k)
34
+ s = 0.0
35
+ if not (b+d).zero? and not (a+c).zero?
36
+ s = (d/(b+d))**(@k) - (c/(a+c))**(@k)
37
+ end
35
38
 
36
39
  set_feature_score(f, k, s)
37
40
  end
@@ -18,7 +18,10 @@ module FSelector
18
18
  each_class do |k|
19
19
  a, b = get_A(f, k), get_B(f, k)
20
20
 
21
- s = a/(a+b)
21
+ s = 0.0
22
+ if not (a+b).zero?
23
+ s = a/(a+b)
24
+ end
22
25
 
23
26
  set_feature_score(f, k, s)
24
27
  end
@@ -22,7 +22,10 @@ module FSelector
22
22
  each_class do |k|
23
23
  a, b, c, d = get_A(f, k), get_B(f, k), get_C(f, k), get_D(f, k)
24
24
 
25
- s = a * (b+d) / (a+c) / b
25
+ s = 0.0
26
+ if not (a+c).zero? and not b.zero?
27
+ s = a * (b+d) / (a+c) / b
28
+ end
26
29
 
27
30
  set_feature_score(f, k, s)
28
31
  end
@@ -18,7 +18,10 @@ module FSelector
18
18
  each_class do |k|
19
19
  a, c = get_A(f, k), get_C(f, k)
20
20
 
21
- s = a/(a+c)
21
+ s =0.0
22
+ if not (a+c).zero?
23
+ s = a/(a+c)
24
+ end
22
25
 
23
26
  set_feature_score(f, k, s)
24
27
  end
@@ -18,7 +18,10 @@ module FSelector
18
18
  each_class do |k|
19
19
  b, d = get_B(f, k), get_D(f, k)
20
20
 
21
- s = d/(b+d)
21
+ s = 0.0
22
+ if not (b+d).zero?
23
+ s = d/(b+d)
24
+ end
22
25
 
23
26
  set_feature_score(f, k, s)
24
27
  end
@@ -11,7 +11,7 @@ module ReplaceMissingValues
11
11
  each_sample do |k, s|
12
12
  each_feature do |f|
13
13
  if not s.has_key? f
14
- s[f] = my_value
14
+ s[f] = val
15
15
  end
16
16
  end
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fselector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-03 00:00:00.000000000 Z
12
+ date: 2012-04-04 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: FSelector is a Ruby gem that aims to integrate various feature selection/ranking
15
15
  algorithms and related functions into one single package. Welcome to contact me
@@ -38,8 +38,6 @@ files:
38
38
  - lib/fselector/algo_base/base_Relief.rb
39
39
  - lib/fselector/algo_base/base_ReliefF.rb
40
40
  - lib/fselector/algo_continuous/CFS_c.rb
41
- - lib/fselector/algo_continuous/discretizer.rb
42
- - lib/fselector/algo_continuous/normalizer.rb
43
41
  - lib/fselector/algo_continuous/PMetric.rb
44
42
  - lib/fselector/algo_continuous/ReliefF_c.rb
45
43
  - lib/fselector/algo_continuous/Relief_c.rb
@@ -72,9 +70,11 @@ files:
72
70
  - lib/fselector/algo_discrete/Sensitivity.rb
73
71
  - lib/fselector/algo_discrete/Specificity.rb
74
72
  - lib/fselector/algo_discrete/SymmetricalUncertainty.rb
73
+ - lib/fselector/discretizer.rb
75
74
  - lib/fselector/ensemble.rb
76
75
  - lib/fselector/entropy.rb
77
76
  - lib/fselector/fileio.rb
77
+ - lib/fselector/normalizer.rb
78
78
  - lib/fselector/replace_missing_values.rb
79
79
  - lib/fselector/util.rb
80
80
  - lib/fselector.rb