sklearn
のStandardScaler
を使用したい。一部の機能列に適用して他の機能列に適用することはできますか?
たとえば、私のdata
は次のようになります。
data = pd.DataFrame({'Name' : [3, 4,6], 'Age' : [18, 92,98], 'Weight' : [68, 59,49]})
Age Name Weight
0 18 3 68
1 92 4 59
2 98 6 49
col_names = ['Name', 'Age', 'Weight']
features = data[col_names]
data
をフィットして変換します
scaler = StandardScaler().fit(features.values)
features = scaler.transform(features.values)
scaled_features = pd.DataFrame(features, columns = col_names)
Name Age Weight
0 -1.069045 -1.411004 1.202703
1 -0.267261 0.623041 0.042954
2 1.336306 0.787964 -1.245657
もちろん名前は実際には整数ではなく文字列であり、標準化したくありません。 fit
メソッドとtransform
メソッドを列Age
とWeight
にのみ適用するにはどうすればよいですか?
現在、これを処理する最良の方法は、説明されている here のようにColumnTransformerを使用することです。
まず、データフレームのコピーを作成します。
scaled_features = data.copy()
変換にName列を含めないでください。
col_names = ['Age', 'Weight']
features = scaled_features[col_names]
scaler = StandardScaler().fit(features.values)
features = scaler.transform(features.values)
ここで、新しいデータフレームを作成せずに、結果をこれらの2つの列に割り当てます。
scaled_features[col_names] = features
print(scaled_features)
Age Name Weight
0 -1.411004 3 1.202703
1 0.623041 4 0.042954
2 0.787964 6 -1.245657
V0.20で導入された ColumnTransformer は、配列の指定された列のセットまたはpandas DataFrame。
import pandas as pd
data = pd.DataFrame({'Name' : [3, 4,6], 'Age' : [18, 92,98], 'Weight' : [68, 59,49]})
col_names = ['Name', 'Age', 'Weight']
features = data[col_names]
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
ct = ColumnTransformer([
('somename', StandardScaler(), ['Age', 'Weight'])
], remainder='passthrough')
ct.fit_transform(features)
注意:パイプラインと同様に、簡略版もあります make_column_transformer トランスフォーマーに名前を付ける必要はありません
-1.41100443, 1.20270298, 3.
0.62304092, 0.04295368, 4.
0.78796352, -1.24565666, 6.
もう1つのオプションは、スケーリングの前にName列をドロップし、それをマージして戻すことです。
data = pd.DataFrame({'Name' : [3, 4,6], 'Age' : [18, 92,98], 'Weight' : [68, 59,49]})
from sklearn.preprocessing import StandardScaler
# Save the variable you don't want to scale
name_var = data['Name']
# Fit scaler to your data
scaler.fit(data.drop('Name', axis = 1))
# Calculate scaled values and store them in a separate object
scaled_values = scaler.transform(data.drop('Name', axis = 1))
data = pd.DataFrame(scaled_values, index = data.index, columns = data.drop('ID', axis = 1).columns)
data['Name'] = name_var
print(data)
これを行うためのよりPython的な方法-
from sklearn.preprocessing import StandardScaler
data[['Age','Weight']] = data[['Age','Weight']].apply(
lambda x: StandardScaler().fit_transform(x))
data
出力-
Age Name Weight
0 -1.411004 3 1.202703
1 0.623041 4 0.042954
2 0.787964 6 -1.245657