disparateImpactRemover
説明
バイナリ分類の公平性を確立するために、関数 disparateImpactRemover
を使用してセンシティブ属性による差異の影響を除去または軽減できます。モデルに学習させる前に、センシティブ属性を使用して学習データ セット内の連続予測子を変換します。変換されたデータ セットと変換が格納された disparateImpactRemover
オブジェクトが関数から返されます。変換されたデータ セットを fitcsvm
などの適切な学習関数に渡し、オブジェクトをオブジェクト関数 transform
に渡して、テスト データ セットなどの新しいデータ セットに変換を適用します。
メモ
テスト データなどの新しいデータは、モデルに学習させた後に disparateImpactRemover
を使用して変換しなければなりません。そうしないと、予測結果が不正確になります。
作成
構文
説明
は、table remover
= disparateImpactRemover(Tbl
,AttributeName
)Tbl
内のセンシティブ属性 AttributeName
による差異の影響をデータ セット Tbl
内の連続予測子を変換することで除去します。返される disparateImpactRemover
オブジェクト (remover
) には、新しいデータに適用できる変換が格納されます。詳細については、アルゴリズムを参照してください。
[
は、remover
,transformedData
] = disparateImpactRemover(Tbl
,AttributeName
)Tbl
のデータに対応する変換後の予測子データ transformedData
も返します。
この構文では、transformedData
にセンシティブ属性が含まれることに注意してください。disparateImpactRemover
を使用した後は、モデルに学習させるときにセンシティブ属性を個別の予測子として使用しないようにしてください。
[
は、数値予測子データ remover
,transformedData
] = disparateImpactRemover(X
,attribute
)X
と attribute
で指定されたセンシティブ属性を使用して予測子を変換します。
[
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、名前と値の引数 remover
,transformedData
] = disparateImpactRemover(___,Name=Value
)RepairFraction
を使用してデータ変換の範囲を指定できます。値 1 は完全な変換を示し、値 0 は変換なしを示します。
入力引数
Tbl
— データ セット
テーブル
データ セット。table として指定します。Tbl
の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。disparateImpactRemover
で table を使用するときは、table にセンシティブ属性を含める必要があります。応答変数などの追加の変数も table に含めることができます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
Tbl
に含まれている一部の数値変数 (観測値の重みなど) を disparateImpactRemover
で無視する場合は、変換する連続数値変数を名前と値の引数 PredictorNames
を使用して指定できます。
データ型: table
AttributeName
— センシティブ属性の名前
Tbl
内の変数の名前
センシティブ属性の名前。Tbl
内の変数の名前として指定します。AttributeName
は文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、センシティブ属性が Tbl.Attribute
として格納されている場合、"Attribute"
として指定します。
センシティブ属性は、数値ベクトル、logical ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical ベクトルでなければなりません。
データ型: char
| string
X
— 予測子データ
数値行列
予測子データ。数値行列として指定します。X
の各行は 1 つの観測値に対応し、各列は 1 つの予測子変数に対応します。X
と attribute
の行数は同じでなければなりません。
予測子の名前を X
に表示される順序で指定するには、名前と値の引数 PredictorNames
を使用します。
データ型: single
| double
attribute
— センシティブ属性
数値列ベクトル | logical 列ベクトル | 文字配列 | string 配列 | 文字ベクトルの cell 配列 | categorical 列ベクトル
センシティブ属性。数値列ベクトル、logical 列ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして指定します。
attribute
が配列の場合、配列の各行がセンシティブ属性のグループに対応していなければなりません。attribute
とX
の行数は同じでなければなりません。
データ型: single
| double
| logical
| char
| string
| cell
| categorical
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
例: disparateImpactRemover(Tbl,"Age",PredictorNames=["Diastolic","Systolic"])
は、table Tbl
内の変数 Diastolic
と Systolic
を Tbl
内のセンシティブ属性 Age
を使用して変換するように指定します。
PredictorNames
— 変換する予測子変数の名前
一意な名前の string 配列 | 一意な文字ベクトルの cell 配列
変換する予測子変数の名前。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。
Tbl
を指定した場合、PredictorNames
を使用して変換する数値予測子変数を指定できます。X
を指定した場合、PredictorNames
を使用してX
内の予測子変数に名前を割り当てることができます。
例: PredictorNames=["SepalLength","SepalWidth","PetalLength","PetalWidth"]
データ型: string
| cell
RepairFraction
— データ変換の比率
1
(既定値) | 範囲 [0,1] の数値スカラー
データ変換の比率。範囲 [0,1] の数値スカラーとして指定します。値 1 は完全な変換を示し、値 0 は変換なしを示します。
修復率が大きいほど、モデル予測の精度が低下する可能性があります。詳細については、[1]を参照してください。
例: RepairFraction=0.5
データ型: single
| double
出力引数
remover
— 予測子データの変換器
disparateImpactRemover
オブジェクト
予測子データの変換器。disparateImpactRemover
オブジェクトとして返されます。remover
には、変数 remover.SensitiveAttribute
を基準とする予測子変数 remover.PredictorNames
の変換が格納されます。
transformedData
— 変換後の予測子データ
テーブル | 数値行列
Tbl
または X
のデータに対応する変換後の予測子データ。table または数値行列として返されます。transformedData
にセンシティブ属性が含まれる場合があることに注意してください。関数 disparateImpactRemover
を使用した後は、モデルに学習させるときにセンシティブ属性を個別の予測子として使用しないようにしてください。
プロパティ
RepairFraction
— データ変換の比率
範囲 [0,1] の数値スカラー
この プロパティ は読み取り専用です。
データ変換の比率。範囲 [0,1] の数値スカラーとして返されます。値 1 は完全な変換を示し、値 0 は変換なしを示します。
disparateImpactRemover
オブジェクトの作成後に修復率を調整する場合は、オブジェクト関数 transform
の名前と値の引数 RepairFraction
を指定します。
データ型: single
| double
PredictorNames
— 変換された予測子変数の名前
一意な文字ベクトルの cell 配列
この プロパティ は読み取り専用です。
変換された予測子変数の名前。一意な文字ベクトルの cell 配列として返されます。PredictorNames
の要素の順序は、Tbl
または X
のデータにおける予測子名の順序に対応します。
データ型: cell
SensitiveAttribute
— センシティブ属性
変数名 | 数値列ベクトル | logical 列ベクトル | 文字配列 | 文字ベクトルの cell 配列 | categorical 列ベクトル
この プロパティ は読み取り専用です。
センシティブ属性。変数名、数値列ベクトル、logical 列ベクトル、文字配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして返されます。
table を使用して
disparateImpactRemover
オブジェクトを作成する場合、SensitiveAttribute
はセンシティブ属性の名前になります。名前は文字ベクトルとして格納されます。行列を使用して
disparateImpactRemover
オブジェクトを作成する場合、SensitiveAttribute
のサイズとデータ型はオブジェクトの作成に使用されるセンシティブ属性と同じになります。(string 配列は文字ベクトルの cell 配列として扱われます)。
データ型: single
| double
| logical
| char
| cell
| categorical
オブジェクト関数
transform | 新しい予測子データを変換して差異の影響を除去 |
例
予測による差異の影響の軽減
バイナリ分類器に学習させ、モデルを使用してテスト データを分類し、センシティブ属性の各グループについての差異の影響を計算します。差異の影響の値を小さくするために、disparateImpactRemover
を使用してからバイナリ分類器に再学習させます。テスト データ セットを変換し、観測値を再分類して、差異の影響の値を計算します。
学習データ adultdata
およびテスト データ adulttest
を含む、標本データ census1994
を読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するために使用できる、米国国勢調査局の人口統計情報から構成されています。学習データ セットの最初の数行をプレビューします。
load census1994
head(adultdata)
age workClass fnlwgt education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary ___ ________________ __________ _________ _____________ _____________________ _________________ _____________ _____ ______ ____________ ____________ ______________ ______________ ______ 39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States <=50K 50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States <=50K 38 Private 2.1565e+05 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States <=50K 53 Private 2.3472e+05 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States <=50K 28 Private 3.3841e+05 Bachelors 13 Married-civ-spouse Prof-specialty Wife Black Female 0 0 40 Cuba <=50K 37 Private 2.8458e+05 Masters 14 Married-civ-spouse Exec-managerial Wife White Female 0 0 40 United-States <=50K 49 Private 1.6019e+05 9th 5 Married-spouse-absent Other-service Not-in-family Black Female 0 0 16 Jamaica <=50K 52 Self-emp-not-inc 2.0964e+05 HS-grad 9 Married-civ-spouse Exec-managerial Husband White Male 0 0 45 United-States >50K
各行には、成人 1 人の人口統計情報が格納されています。最後の列 salary
は個人の年収が $50,000 以下か、$50,000 を超えるかどうかを示します。
adultdata
と adulttest
から欠損値を含む観測値を削除します。
adultdata = rmmissing(adultdata); adulttest = rmmissing(adulttest);
モデルの学習に使用する連続数値予測子を指定します。
predictors = ["age","education_num","capital_gain","capital_loss", ... "hours_per_week"];
学習セット adultdata
を使用してアンサンブル分類器に学習させます。応答変数として salary
、観測値の重みとして fnlwgt
を指定します。学習セットが不均衡であるため、RUSBoost
アルゴリズムを使用します。モデルに学習させた後、テスト セット adulttest
の観測値の給与 (クラス ラベル) を予測します。
rng("default") % For reproducibility mdl = fitcensemble(adultdata,"salary",Weights="fnlwgt", ... PredictorNames=predictors,Method="RUSBoost"); labels = predict(mdl,adulttest);
センシティブ属性 race
を使用して学習セットの予測子を変換します。
[remover,newadultdata] = disparateImpactRemover(adultdata, ... "race",PredictorNames=predictors); remover
remover = disparateImpactRemover with properties: RepairFraction: 1 PredictorNames: {'age' 'education_num' 'capital_gain' 'capital_loss' 'hours_per_week'} SensitiveAttribute: 'race'
remover
は disparateImpactRemover
オブジェクトであり、変数 remover.SensitiveAttribute
を基準とする予測子 remover.PredictorNames
の変換が格納されます。
remover
に格納された同じ変換をテスト セットの予測子に適用します。メモ: 学習データ セットとテスト データ セットは、どちらも分類器に渡す前に変換する必要があります。
newadulttest = transform(remover,adulttest, ...
PredictorNames=predictors);
mdl
と同じタイプのアンサンブル分類器に今度は変換後の予測子データを使用して学習させます。前と同じように、テスト セット adulttest
の観測値の給与 (クラス ラベル) を予測します。
rng("default") % For reproducibility newMdl = fitcensemble(newadultdata,"salary",Weights="fnlwgt", ... PredictorNames=predictors,Method="RUSBoost"); newLabels = predict(newMdl,newadulttest);
元のモデル (mdl
) による予測と変換後のデータで学習させたモデル (newMdl
) による予測について、差異の影響の値を比較します。差異の影響の値は、センシティブ属性のグループごとに、そのグループの陽性クラスの値をもつ予測の比率 () を参照グループの陽性クラスの値をもつ予測の比率 () で除算したものです。理想的な分類器による予測では、各グループの が に近くなります (つまり、差異の影響の値が 1 に近くなります)。
fairnessMetrics
を使用して、mdl
による予測と newMdl
による予測の差異の影響の値を計算します。観測値の重みを含めます。オブジェクト関数 report
を使用して、evaluator
オブジェクトに格納された差異の影響などのバイアス メトリクスを表示できます。
evaluator = fairnessMetrics(adulttest,"salary", ... SensitiveAttributeNames="race",Predictions=[labels,newLabels], ... Weights="fnlwgt",ModelNames=["Original Model","New Model"]); evaluator.PositiveClass
ans = categorical
>50K
evaluator.ReferenceGroup
ans = 'White'
report(evaluator,BiasMetrics="DisparateImpact")
ans=5×5 table
Metrics SensitiveAttributeNames Groups Original Model New Model
_______________ _______________________ __________________ ______________ _________
DisparateImpact race Amer-Indian-Eskimo 0.41702 0.92804
DisparateImpact race Asian-Pac-Islander 1.719 0.9697
DisparateImpact race Black 0.60571 0.66629
DisparateImpact race Other 0.66958 0.86039
DisparateImpact race White 1 1
mdl
による予測について、いくつかの差異の影響の値が業界標準の 0.8 を下回っており、1.25 を超える値も 1 つあります。これらの値は、陽性クラス >50K
とセンシティブ属性 race
を基準とする予測のバイアスを示しています。
mdl
による予測の差異の影響の値に比べ、newMdl
による予測の差異の影響の値は 1 に近くなっています。0.8 を下回る値もまだ 1 つあります。
オブジェクト関数 plot
で返される棒グラフを使用して、差異の影響の値を視覚的に比較します。
plot(evaluator,"DisparateImpact")
関数 disparateImpactRemover
により、差異の影響のメトリクスに関しては、テスト セットに対するモデル予測が改善しているように見えます。
変換後の予測子がモデル予測の精度にマイナスの影響を与えていないかどうかをチェックします。2 つのモデル mdl
と newMdl
について、テスト セットの予測の精度を計算します。
accuracy = 1-loss(mdl,adulttest,"salary")
accuracy = 0.8024
newAccuracy = 1-loss(newMdl,newadulttest,"salary")
newAccuracy = 0.7955
テスト セットの精度について、変換後の予測子を使用して学習させたモデル (newMdl
) でも元の予測子で学習させたモデル (mdl
) と同等の精度になっています。
差異の影響の除去についての理解と可視化
連続数値予測子を調整してセンシティブ属性による差異の影響の除去を試みます。元の予測子と調整後の予測子の値の違いを可視化します。
患者の拡張期および収縮期の血圧の値に基づいて患者が喫煙者であるかどうかを予測するバイナリ分類器を作成するとします。さらに、モデル予測に対する患者の性別による差異の影響を除去します。モデルに学習させる前に、disparateImpactRemover
を使用してデータ セット内の連続予測子変数を変換できます。
100 人の患者の医療情報を含む patients
データ セットを読み込みます。変数 Gender
と Smoker
を categorical
変数に変換します。1
と 0
の代わりに、Smoker
と Nonsmoker
というわかりやすいカテゴリ名を指定します。
load patients Gender = categorical(Gender); Smoker = categorical(Smoker,logical([1 0]), ... ["Smoker","Nonsmoker"]);
連続予測子 Diastolic
と Systolic
を含む行列を作成します。
X = [Diastolic,Systolic];
センシティブ属性 Gender
の 2 つのグループの観測値を調べます。
femaleIdx = Gender=="Female"; maleIdx = Gender=="Male"; femaleX = X(femaleIdx,:); maleX = X(maleIdx,:);
センシティブ属性の 2 つのグループの Diastolic
と Systolic
の分位数を計算します。分位数は、センシティブ属性の全グループで、観測値が最も少ないグループの観測値数が 100 より小さければその値にするように指定します。
t = tabulate(Gender); t = array2table(t,VariableNames=["Value","Count","Percent"])
t=2×3 table
Value Count Percent
__________ ______ _______
{'Female'} {[53]} {[53]}
{'Male' } {[47]} {[47]}
numQuantiles = min(100,min(t.Count{:}))
numQuantiles = 47
femaleQuantiles = quantile(femaleX,numQuantiles,1); maleQuantiles = quantile(maleX,numQuantiles,1);
2 つのグループの分位数の中央値を計算します。
Q(:,:,1) = femaleQuantiles; Q(:,:,2) = maleQuantiles; medianQuantiles = median(Q,3);
結果をプロットします。左側のプロットに Diastolic
の分位数、右側のプロットに Systolic
の分位数を表示します。
tiledlayout(1,2) nexttile % Diastolic plot(femaleQuantiles(:,1),1:numQuantiles) hold on plot(maleQuantiles(:,1),1:numQuantiles) plot(medianQuantiles(:,1),1:numQuantiles) hold off xlabel("Diastolic") ylabel("Quantile") legend(["Female","Male","Median"],Location="southeast") nexttile % Systolic plot(femaleQuantiles(:,2),1:numQuantiles) hold on plot(maleQuantiles(:,2),1:numQuantiles) plot(medianQuantiles(:,2),1:numQuantiles) hold off xlabel("Systolic") ylabel("Quantile") legend(["Female","Male","Median"],Location="southeast")
各予測子で Female
と Male
の分位数が異なっています。この違いを関数 disparateImpactRemover
で分位数の中央値を使用して調整します。
センシティブ属性 Gender
を使用して X
の予測子 Diastolic
と Systolic
を変換します。
[remover,newX] = disparateImpactRemover(X,Gender); femaleNewX = newX(femaleIdx,:); maleNewX = newX(maleIdx,:);
X
の元の値と newX
の変換後の値での Diastolic
の分布の違いを可視化します。関数 ksdensity
を使用して、確率密度推定を計算して表示します。
tiledlayout(1,2) nexttile ksdensity(femaleX(:,1)) hold on ksdensity(maleX(:,1)) hold off xlabel("Diastolic") ylabel("Probability Density Estimate") title("Original") legend(["Female","Male"]) ylim([0,0.07]) nexttile ksdensity(femaleNewX{:,1}) hold on ksdensity(maleNewX{:,1}) hold off xlabel("Diastolic") ylabel("Probability Density Estimate") title("Transformed") legend(["Female","Male"]) ylim([0,0.07])
関数 disparateImpactRemover
によって予測子変数 Diastolic
の値が変換され、Female
の値の分布と Male
の値の分布が似たような分布になっています。
これで、調整後の予測子データを使用してバイナリ分類器に学習させることができます。この例では、木分類器に学習させます。
tree = fitctree(newX,Smoker)
tree = ClassificationTree PredictorNames: {'x1' 'x2'} ResponseName: 'Y' CategoricalPredictors: [] ClassNames: [Smoker Nonsmoker] ScoreTransform: 'none' NumObservations: 100
メモ: 新しいデータ セットは、予測用に分類器に渡す前に変換する必要があります。
X
から 10 個の観測値を無作為に抽出します。remover
オブジェクトとオブジェクト関数 transform
を使用して値を変換します。その後、観測値について喫煙状況を予測します。
rng("default") % For reproducibility testIdx = randsample(size(X,1),10,1); testX = transform(remover,X(testIdx,:),Gender(testIdx)); label = predict(tree,testX)
label = 10x1 categorical
Nonsmoker
Smoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Smoker
Smoker
Smoker
異なる修復率の指定
センシティブ属性を基準とする連続数値予測子の変換の範囲を指定します。関数 disparateImpactRemover
の名前と値の引数 RepairFraction
を使用します。
100 人の患者の医療情報を含む patients
データ セットを読み込みます。変数 Gender
と Smoker
をカテゴリカル変数に変換します。1
と 0
の代わりに、Smoker
と Nonsmoker
というわかりやすいカテゴリ名を指定します。
load patients Gender = categorical(Gender); Smoker = categorical(Smoker,logical([1 0]), ... ["Smoker","Nonsmoker"]);
連続予測子 Diastolic
と Systolic
を含む行列を作成します。
X = [Diastolic,Systolic];
センシティブ属性 Gender
の 2 つのグループの観測値を調べます。
femaleIdx = Gender=="Female"; maleIdx = Gender=="Male"; femaleX = X(femaleIdx,:); maleX = X(maleIdx,:);
センシティブ属性 Gender
を使用して X
の予測子 Diastolic
と Systolic
を変換します。修復率を 0.5 と指定します。値 1 は完全な変換を示し、値 0 は変換なしを示すことに注意してください。
[remover,newX50] = disparateImpactRemover(X,Gender, ...
RepairFraction=0.5);
femaleNewX50 = newX50(femaleIdx,:);
maleNewX50 = newX50(maleIdx,:);
remover
オブジェクトのオブジェクト関数 transform
を使用して、予測子変数を完全に変換します。
newX100 = transform(remover,X,Gender,RepairFraction=1); femaleNewX100 = newX100(femaleIdx,:); maleNewX100 = newX100(maleIdx,:);
X
の元の値、newX50
の部分的に修復した値、および newX100
の完全に変換した値での Diastolic
の分布の違いを可視化します。関数 ksdensity
を使用して、確率密度推定を計算して表示します。
t = tiledlayout(1,3); title(t,"Diastolic Distributions with Different " + ... "Repair Fractions") xlabel(t,"Diastolic") ylabel(t,"Density Estimate") nexttile ksdensity(femaleX(:,1)) hold on ksdensity(maleX(:,1)) hold off title("Fraction=0") ylim([0,0.07]) nexttile ksdensity(femaleNewX50{:,1}) hold on ksdensity(maleNewX50{:,1}) hold off title("Fraction=0.5") ylim([0,0.07]) nexttile ksdensity(femaleNewX100{:,1}) hold on ksdensity(maleNewX100{:,1}) hold off title("Fraction=1") ylim([0,0.07]) legend(["Female","Male"],Location="eastoutside")
関数 disparateImpactRemover
によって予測子変数 Diastolic
の値が変換され、修復率が大きくなるほど、Female
の値の分布と Male
の値の分布がより似たような分布になっています。
詳細
差異の影響
差異の影響の値は、センシティブ属性のグループごとに、そのグループの陽性クラスの値をもつ観測値の比率 (pg+) を参照グループの陽性クラスの値をもつ観測値の比率 (pr+) で除算したものです。各グループの pg+ が pr+ に近くなる、つまり差異の影響の値が 1 に近くなるのが理想的です。
差異の影響およびその他のバイアス メトリクスの詳細については、バイアス メトリクスを参照してください。
ヒント
アルゴリズム
disparateImpactRemover
は、Tbl
または X
の連続予測子を次のように変換します。
センシティブ属性のグループを使用して予測子の値を分割します。それぞれのグループ g について、関数
quantile
を使用して予測子の値の分位数 q を計算します。分位数 q は、100 か、センシティブ属性の全グループで観測値が最も少ないグループの観測値数の、いずれか小さい方になります。関数discretize
を使用して、対応するビン化関数 Fg を作成します。分位数の値がビンのエッジとして使用されます。次に、センシティブ属性の全グループの分位数の中央値を求め、関連する分位数関数 Fm-1 を形成します。この計算では欠損値 (
NaN
) は省略されます。最後に、変換 λFm-1(Fg(x)) + (1 – λ)x を使用して、センシティブ属性のグループ g の予測子の値 x を変換します。ここで、λ は修復率
RepairFraction
です。予測子の欠損値 (NaN
) は保持されます。
新しい予測子データに適用できる変換が関数によって格納されます。
詳細については、[1]を参照してください。
参照
[1] Feldman, Michael, Sorelle A. Friedler, John Moeller, Carlos Scheidegger, and Suresh Venkatasubramanian. “Certifying and Removing Disparate Impact.” In Proceedings of the 21th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 259–68. Sydney NSW Australia: ACM, 2015. https://doi.org/10.1145/2783258.2783311.
バージョン履歴
R2022b で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)