Use both sample_weight and class_weight simultaneously
My dataset already has weighted examples. And in this binary classification I also have far more of the first class compared to the second.
Can I use both sample_weight
and further re-weight it with class_weight
in the model.fit()
function?
Or do I first make a new array of new_weights and pass it to the fit function as sample_weight
?
Edit:
TO further clarify, I already have individual weights for each sample in my dataset, and to further add to the complexity, the total sum of sample weights of the first class is far more than the total sample weights of the second class.
For example I currently have:
y = [0,0,0,0,1,1]
sample_weights = [0.01,0.03,0.05,0.02, 0.01,0.02]
so the sum of weights for class '0' is 0.11 and for class '1' is 0.03. So I should have:
class_weight = {0 : 1. , 1: 0.11/0.03}
I need to use both sample_weight
AND class_weight
features. If one overrides the other then I will have to create new sample_weights and then use fit()
or train_on_batch()
.
So my question is, can I use both, or does one override the other?
python tensorflow keras
add a comment |
My dataset already has weighted examples. And in this binary classification I also have far more of the first class compared to the second.
Can I use both sample_weight
and further re-weight it with class_weight
in the model.fit()
function?
Or do I first make a new array of new_weights and pass it to the fit function as sample_weight
?
Edit:
TO further clarify, I already have individual weights for each sample in my dataset, and to further add to the complexity, the total sum of sample weights of the first class is far more than the total sample weights of the second class.
For example I currently have:
y = [0,0,0,0,1,1]
sample_weights = [0.01,0.03,0.05,0.02, 0.01,0.02]
so the sum of weights for class '0' is 0.11 and for class '1' is 0.03. So I should have:
class_weight = {0 : 1. , 1: 0.11/0.03}
I need to use both sample_weight
AND class_weight
features. If one overrides the other then I will have to create new sample_weights and then use fit()
or train_on_batch()
.
So my question is, can I use both, or does one override the other?
python tensorflow keras
add a comment |
My dataset already has weighted examples. And in this binary classification I also have far more of the first class compared to the second.
Can I use both sample_weight
and further re-weight it with class_weight
in the model.fit()
function?
Or do I first make a new array of new_weights and pass it to the fit function as sample_weight
?
Edit:
TO further clarify, I already have individual weights for each sample in my dataset, and to further add to the complexity, the total sum of sample weights of the first class is far more than the total sample weights of the second class.
For example I currently have:
y = [0,0,0,0,1,1]
sample_weights = [0.01,0.03,0.05,0.02, 0.01,0.02]
so the sum of weights for class '0' is 0.11 and for class '1' is 0.03. So I should have:
class_weight = {0 : 1. , 1: 0.11/0.03}
I need to use both sample_weight
AND class_weight
features. If one overrides the other then I will have to create new sample_weights and then use fit()
or train_on_batch()
.
So my question is, can I use both, or does one override the other?
python tensorflow keras
My dataset already has weighted examples. And in this binary classification I also have far more of the first class compared to the second.
Can I use both sample_weight
and further re-weight it with class_weight
in the model.fit()
function?
Or do I first make a new array of new_weights and pass it to the fit function as sample_weight
?
Edit:
TO further clarify, I already have individual weights for each sample in my dataset, and to further add to the complexity, the total sum of sample weights of the first class is far more than the total sample weights of the second class.
For example I currently have:
y = [0,0,0,0,1,1]
sample_weights = [0.01,0.03,0.05,0.02, 0.01,0.02]
so the sum of weights for class '0' is 0.11 and for class '1' is 0.03. So I should have:
class_weight = {0 : 1. , 1: 0.11/0.03}
I need to use both sample_weight
AND class_weight
features. If one overrides the other then I will have to create new sample_weights and then use fit()
or train_on_batch()
.
So my question is, can I use both, or does one override the other?
python tensorflow keras
python tensorflow keras
edited Jan 10 '18 at 9:59
user7867665
asked Jan 9 '18 at 16:59
user7867665user7867665
19012
19012
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
You can surely do both if you want, the thing is if that is what you need. According to the keras docs:
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].
So given that you mention that you "have far more of the first class compared to the second" I think that you should go for the class_weight
parameter. There you can indicate that ratio your dataset presents so you can compensate for imbalanced data classes. The sample_weight
is more when you want to define a weight or importance for each data element.
For example if you pass:
class_weight = {0 : 1. , 1: 50.}
you will be saying that every sample from class 1
would count as 50 samples from class 0
, therefore giving more "importance" to your elements from class 1
(as you have less of those samples surely). You can custom this to fit your own needs. More info con imbalanced datasets on this great question.
Note: To further compare both parameters, have in mind that passing class_weight
as {0:1., 1:50.}
would be equivalent to pass sample_weight
as [1.,1.,1.,...,50.,50.,...]
, given you had samples whose classes where [0,0,0,...,1,1,...]
.
As we can see it is more practical to use class_weight
on this case, and sample_weight
could be of use on more specific cases where you actually want to give an "importance" to each sample individually. Using both can also be done if the case requires it, but one has to have in mind its cumulative effect.
Edit: As per your new question, digging on the Keras source code it seems that indeed sample_weights
overrides class_weights
, here is the piece of code that does it on the _standarize_weigths
method (line 499):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
This means that you can only use one or the other, but not both. Therefore you will indeed need to multiply your sample_weights
by the ratio you need to compensate for the imbalance.
1
Actually,sample_weight
will overrideclass_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it tofit
.
– Yu-Yang
Jan 10 '18 at 3:28
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that usingclass_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculatingsample_weighs
could help more.
– DarkCygnus
Jan 10 '18 at 3:33
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training withsample_weights
. Perhaps we make a feature request
– user7867665
Jan 11 '18 at 19:54
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
|
show 1 more comment
To add a little to DarkCygnus answer, for those who actually need to use class weight & sample weights simultaneously:
Here is a code, that I use for generating sample weights for classifying multiclass temporal data in sequences:
(targets is an array of dimension [#temporal, #categories] with values being in set(#classes), class_weights is an array of [#categories, #classes]).
The generated sequence has the same length as the targets array and the common usecase in batching is to pad the targets with zeros and the sample weights also up to the same size, thus making the network ignore the padded data.
def multiclass_temoral_class_weights(targets, class_weights):
s_weights = np.ones((targets.shape[0],))
# if we are counting the classes, the weights do not exist yet!
if class_weights is not None:
for i in range(len(s_weights)):
weight = 0.0
for itarget, target in enumerate(targets[i]):
weight += class_weights[itarget][int(round(target))]
s_weights[i] = weight
return s_weights
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f48173168%2fuse-both-sample-weight-and-class-weight-simultaneously%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can surely do both if you want, the thing is if that is what you need. According to the keras docs:
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].
So given that you mention that you "have far more of the first class compared to the second" I think that you should go for the class_weight
parameter. There you can indicate that ratio your dataset presents so you can compensate for imbalanced data classes. The sample_weight
is more when you want to define a weight or importance for each data element.
For example if you pass:
class_weight = {0 : 1. , 1: 50.}
you will be saying that every sample from class 1
would count as 50 samples from class 0
, therefore giving more "importance" to your elements from class 1
(as you have less of those samples surely). You can custom this to fit your own needs. More info con imbalanced datasets on this great question.
Note: To further compare both parameters, have in mind that passing class_weight
as {0:1., 1:50.}
would be equivalent to pass sample_weight
as [1.,1.,1.,...,50.,50.,...]
, given you had samples whose classes where [0,0,0,...,1,1,...]
.
As we can see it is more practical to use class_weight
on this case, and sample_weight
could be of use on more specific cases where you actually want to give an "importance" to each sample individually. Using both can also be done if the case requires it, but one has to have in mind its cumulative effect.
Edit: As per your new question, digging on the Keras source code it seems that indeed sample_weights
overrides class_weights
, here is the piece of code that does it on the _standarize_weigths
method (line 499):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
This means that you can only use one or the other, but not both. Therefore you will indeed need to multiply your sample_weights
by the ratio you need to compensate for the imbalance.
1
Actually,sample_weight
will overrideclass_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it tofit
.
– Yu-Yang
Jan 10 '18 at 3:28
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that usingclass_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculatingsample_weighs
could help more.
– DarkCygnus
Jan 10 '18 at 3:33
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training withsample_weights
. Perhaps we make a feature request
– user7867665
Jan 11 '18 at 19:54
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
|
show 1 more comment
You can surely do both if you want, the thing is if that is what you need. According to the keras docs:
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].
So given that you mention that you "have far more of the first class compared to the second" I think that you should go for the class_weight
parameter. There you can indicate that ratio your dataset presents so you can compensate for imbalanced data classes. The sample_weight
is more when you want to define a weight or importance for each data element.
For example if you pass:
class_weight = {0 : 1. , 1: 50.}
you will be saying that every sample from class 1
would count as 50 samples from class 0
, therefore giving more "importance" to your elements from class 1
(as you have less of those samples surely). You can custom this to fit your own needs. More info con imbalanced datasets on this great question.
Note: To further compare both parameters, have in mind that passing class_weight
as {0:1., 1:50.}
would be equivalent to pass sample_weight
as [1.,1.,1.,...,50.,50.,...]
, given you had samples whose classes where [0,0,0,...,1,1,...]
.
As we can see it is more practical to use class_weight
on this case, and sample_weight
could be of use on more specific cases where you actually want to give an "importance" to each sample individually. Using both can also be done if the case requires it, but one has to have in mind its cumulative effect.
Edit: As per your new question, digging on the Keras source code it seems that indeed sample_weights
overrides class_weights
, here is the piece of code that does it on the _standarize_weigths
method (line 499):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
This means that you can only use one or the other, but not both. Therefore you will indeed need to multiply your sample_weights
by the ratio you need to compensate for the imbalance.
1
Actually,sample_weight
will overrideclass_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it tofit
.
– Yu-Yang
Jan 10 '18 at 3:28
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that usingclass_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculatingsample_weighs
could help more.
– DarkCygnus
Jan 10 '18 at 3:33
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training withsample_weights
. Perhaps we make a feature request
– user7867665
Jan 11 '18 at 19:54
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
|
show 1 more comment
You can surely do both if you want, the thing is if that is what you need. According to the keras docs:
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].
So given that you mention that you "have far more of the first class compared to the second" I think that you should go for the class_weight
parameter. There you can indicate that ratio your dataset presents so you can compensate for imbalanced data classes. The sample_weight
is more when you want to define a weight or importance for each data element.
For example if you pass:
class_weight = {0 : 1. , 1: 50.}
you will be saying that every sample from class 1
would count as 50 samples from class 0
, therefore giving more "importance" to your elements from class 1
(as you have less of those samples surely). You can custom this to fit your own needs. More info con imbalanced datasets on this great question.
Note: To further compare both parameters, have in mind that passing class_weight
as {0:1., 1:50.}
would be equivalent to pass sample_weight
as [1.,1.,1.,...,50.,50.,...]
, given you had samples whose classes where [0,0,0,...,1,1,...]
.
As we can see it is more practical to use class_weight
on this case, and sample_weight
could be of use on more specific cases where you actually want to give an "importance" to each sample individually. Using both can also be done if the case requires it, but one has to have in mind its cumulative effect.
Edit: As per your new question, digging on the Keras source code it seems that indeed sample_weights
overrides class_weights
, here is the piece of code that does it on the _standarize_weigths
method (line 499):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
This means that you can only use one or the other, but not both. Therefore you will indeed need to multiply your sample_weights
by the ratio you need to compensate for the imbalance.
You can surely do both if you want, the thing is if that is what you need. According to the keras docs:
class_weight: Optional dictionary mapping class indices (integers) to a weight (float) value, used for weighting the loss function (during training only). This can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for weighting the loss function (during training only). You can either pass a flat (1D) Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data [...].
So given that you mention that you "have far more of the first class compared to the second" I think that you should go for the class_weight
parameter. There you can indicate that ratio your dataset presents so you can compensate for imbalanced data classes. The sample_weight
is more when you want to define a weight or importance for each data element.
For example if you pass:
class_weight = {0 : 1. , 1: 50.}
you will be saying that every sample from class 1
would count as 50 samples from class 0
, therefore giving more "importance" to your elements from class 1
(as you have less of those samples surely). You can custom this to fit your own needs. More info con imbalanced datasets on this great question.
Note: To further compare both parameters, have in mind that passing class_weight
as {0:1., 1:50.}
would be equivalent to pass sample_weight
as [1.,1.,1.,...,50.,50.,...]
, given you had samples whose classes where [0,0,0,...,1,1,...]
.
As we can see it is more practical to use class_weight
on this case, and sample_weight
could be of use on more specific cases where you actually want to give an "importance" to each sample individually. Using both can also be done if the case requires it, but one has to have in mind its cumulative effect.
Edit: As per your new question, digging on the Keras source code it seems that indeed sample_weights
overrides class_weights
, here is the piece of code that does it on the _standarize_weigths
method (line 499):
if sample_weight is not None:
#...Does some error handling...
return sample_weight #simply returns the weights you passed
elif isinstance(class_weight, dict):
#...Some error handling and computations...
#Then creates an array repeating class weight to match your target classes
weights = np.asarray([class_weight[cls] for cls in y_classes
if cls in class_weight])
#...more error handling...
return weights
This means that you can only use one or the other, but not both. Therefore you will indeed need to multiply your sample_weights
by the ratio you need to compensate for the imbalance.
edited Jan 10 '18 at 15:49
answered Jan 9 '18 at 18:04
DarkCygnusDarkCygnus
3,30832036
3,30832036
1
Actually,sample_weight
will overrideclass_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it tofit
.
– Yu-Yang
Jan 10 '18 at 3:28
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that usingclass_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculatingsample_weighs
could help more.
– DarkCygnus
Jan 10 '18 at 3:33
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training withsample_weights
. Perhaps we make a feature request
– user7867665
Jan 11 '18 at 19:54
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
|
show 1 more comment
1
Actually,sample_weight
will overrideclass_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it tofit
.
– Yu-Yang
Jan 10 '18 at 3:28
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that usingclass_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculatingsample_weighs
could help more.
– DarkCygnus
Jan 10 '18 at 3:33
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training withsample_weights
. Perhaps we make a feature request
– user7867665
Jan 11 '18 at 19:54
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
1
1
Actually,
sample_weight
will override class_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it to fit
.– Yu-Yang
Jan 10 '18 at 3:28
Actually,
sample_weight
will override class_weight
in Keras, and the latter will have no effect at all (somewhat unexpected IMO). So the OP may need to merge the weights into one before passing it to fit
.– Yu-Yang
Jan 10 '18 at 3:28
1
1
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that using
class_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculating sample_weighs
could help more.– DarkCygnus
Jan 10 '18 at 3:33
@Yu-Yang interesting, thanks for sharing (will try that and update when on desktop). Still how OP describes it seems that using
class_weight
will suffice for balancing imbalanced datasets. If further customization is needed then manual merging and calculating sample_weighs
could help more.– DarkCygnus
Jan 10 '18 at 3:33
1
1
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
@user7867665 digging Keras source code I found an answer to your new question, updating shortly.
– DarkCygnus
Jan 10 '18 at 15:38
1
1
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training with
sample_weights
. Perhaps we make a feature request– user7867665
Jan 11 '18 at 19:54
@DarkCygnus Thanks! That clears it up. I'm do the re-weighting before training with
sample_weights
. Perhaps we make a feature request– user7867665
Jan 11 '18 at 19:54
1
1
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
@user7867665 surely that is a feature that may be useful. Go ahead :)
– DarkCygnus
Jan 11 '18 at 20:14
|
show 1 more comment
To add a little to DarkCygnus answer, for those who actually need to use class weight & sample weights simultaneously:
Here is a code, that I use for generating sample weights for classifying multiclass temporal data in sequences:
(targets is an array of dimension [#temporal, #categories] with values being in set(#classes), class_weights is an array of [#categories, #classes]).
The generated sequence has the same length as the targets array and the common usecase in batching is to pad the targets with zeros and the sample weights also up to the same size, thus making the network ignore the padded data.
def multiclass_temoral_class_weights(targets, class_weights):
s_weights = np.ones((targets.shape[0],))
# if we are counting the classes, the weights do not exist yet!
if class_weights is not None:
for i in range(len(s_weights)):
weight = 0.0
for itarget, target in enumerate(targets[i]):
weight += class_weights[itarget][int(round(target))]
s_weights[i] = weight
return s_weights
add a comment |
To add a little to DarkCygnus answer, for those who actually need to use class weight & sample weights simultaneously:
Here is a code, that I use for generating sample weights for classifying multiclass temporal data in sequences:
(targets is an array of dimension [#temporal, #categories] with values being in set(#classes), class_weights is an array of [#categories, #classes]).
The generated sequence has the same length as the targets array and the common usecase in batching is to pad the targets with zeros and the sample weights also up to the same size, thus making the network ignore the padded data.
def multiclass_temoral_class_weights(targets, class_weights):
s_weights = np.ones((targets.shape[0],))
# if we are counting the classes, the weights do not exist yet!
if class_weights is not None:
for i in range(len(s_weights)):
weight = 0.0
for itarget, target in enumerate(targets[i]):
weight += class_weights[itarget][int(round(target))]
s_weights[i] = weight
return s_weights
add a comment |
To add a little to DarkCygnus answer, for those who actually need to use class weight & sample weights simultaneously:
Here is a code, that I use for generating sample weights for classifying multiclass temporal data in sequences:
(targets is an array of dimension [#temporal, #categories] with values being in set(#classes), class_weights is an array of [#categories, #classes]).
The generated sequence has the same length as the targets array and the common usecase in batching is to pad the targets with zeros and the sample weights also up to the same size, thus making the network ignore the padded data.
def multiclass_temoral_class_weights(targets, class_weights):
s_weights = np.ones((targets.shape[0],))
# if we are counting the classes, the weights do not exist yet!
if class_weights is not None:
for i in range(len(s_weights)):
weight = 0.0
for itarget, target in enumerate(targets[i]):
weight += class_weights[itarget][int(round(target))]
s_weights[i] = weight
return s_weights
To add a little to DarkCygnus answer, for those who actually need to use class weight & sample weights simultaneously:
Here is a code, that I use for generating sample weights for classifying multiclass temporal data in sequences:
(targets is an array of dimension [#temporal, #categories] with values being in set(#classes), class_weights is an array of [#categories, #classes]).
The generated sequence has the same length as the targets array and the common usecase in batching is to pad the targets with zeros and the sample weights also up to the same size, thus making the network ignore the padded data.
def multiclass_temoral_class_weights(targets, class_weights):
s_weights = np.ones((targets.shape[0],))
# if we are counting the classes, the weights do not exist yet!
if class_weights is not None:
for i in range(len(s_weights)):
weight = 0.0
for itarget, target in enumerate(targets[i]):
weight += class_weights[itarget][int(round(target))]
s_weights[i] = weight
return s_weights
answered Jan 19 at 9:17
KhajKhaj
244213
244213
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f48173168%2fuse-both-sample-weight-and-class-weight-simultaneously%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown