전처리가 쉬워지는 판다스 파이프라인
pdpipe 관련 글 목록
- pdpipe - Pandas DataFrame 전처리 자동화 01
- pdpipe - Pandas DataFrame 전처리 자동화 02
- pdpipe 공식 문서
- 데이터 과학을 위한 파이썬 라이브러리 모음
데이터 스케일링과 문자열 처리 파이프라인
pdpipe에는 Scikit-learn
의 스케일러 메소드와 NLTK
의 문자열 처리 메소드가 내장되어 있습니다. 따라서 데이터 스케일링과 문자열 처리에도 파이프라인을 심플하게 적용할 수 있습니다.
파이프라인 생성
pdpipe - Pandas DataFrame 전처리 자동화 01 에서 정의한 파이프라인을 다시 한 번 구현해 보고, 스케일링 파이프라인과 문자열 처리 파이프라인을 만들어보겠습니다.
import pandas as pd
import pdpipe as pdp
df = pd.read_csv('Data/USA_Housing.csv')
def size(n):
if n <= 6.3:
return 'Small'
elif 6.3 < n <= 7.7:
return 'Medium'
else:
return 'Big'
df['House_size'] = df['Avg. Area Number of Rooms'].apply(size)
pipeline = pdp.ColDrop('Avg. Area Number of Rooms')
pipeline += pdp.OneHotEncode('House_size')
pipeline += pdp.RowDrop({'Price': lambda x: x <= 250000})
df2 = pipeline(df)
print('Number of Rows : ', len(df2), sep='')
df2.head()
Number of Rows : 4990
Avg. Area Income | Avg. Area House Age | Avg. Area Number of Bedrooms | Area Population | Price | Address | House_size_Medium | House_size_Small | |
---|---|---|---|---|---|---|---|---|
0 | 79545.458574 | 5.682861 | 4.09 | 23086.800503 | 1.059034e+06 | 208 Michael Ferry Apt. 674\nLaurabury, NE 3701... | 1 | 0 |
1 | 79248.642455 | 6.002900 | 3.09 | 40173.072174 | 1.505891e+06 | 188 Johnson Views Suite 079\nLake Kathleen, CA... | 1 | 0 |
2 | 61287.067179 | 5.865890 | 5.13 | 36882.159400 | 1.058988e+06 | 9127 Elizabeth Stravenue\nDanieltown, WI 06482... | 0 | 0 |
3 | 63345.240046 | 7.188236 | 3.26 | 34310.242831 | 1.260617e+06 | USS Barnett\nFPO AP 44820 | 0 | 1 |
4 | 59982.197226 | 5.040555 | 4.23 | 26354.109472 | 6.309435e+05 | USNS Raymond\nFPO AE 09386 | 0 | 0 |
스케일링 기능
머신러닝 모델링 작업 중에 흔히 데이터 스케일링 작업을 진행합니다.
Standardization Scaling
Min-Max Scaling
위 두 가지 스케일링 방법이 가장 흔히 사용됩니다. 이 중에서 첫 번째 스케일링 방법인 Standardization Scaling
을 파이프라인을 통해 사용해보겠습니다. 원-핫 인코딩한 컬럼인 House_size_Medium
과 House_size_Small
컬럼을 제외하고 스케일링을 해보겠습니다. (str 형식의 컬럼은 스케일링 시 옵션 지정을 하지 않아도 자동 제외됩니다.)
pipeline_scaler = pdp.Scale('StandardScaler', exclude_columns=['House_size_Medium', 'House_size_Small'])
df3 = pipeline_scaler(df2)
스케일링된 결과입니다!
df3.head()
Avg. Area Income | Avg. Area House Age | Avg. Area Number of Bedrooms | Area Population | Price | Address | House_size_Medium | House_size_Small | |
---|---|---|---|---|---|---|---|---|
0 | 1.028113 | -0.300130 | 0.087245 | -1.322810 | -0.500532 | 208 Michael Ferry Apt. 674\nLaurabury, NE 3701... | 1 | 0 |
1 | 1.000175 | 0.023142 | -0.722671 | 0.401923 | 0.775998 | 188 Johnson Views Suite 079\nLake Kathleen, CA... | 1 | 0 |
2 | -0.690443 | -0.115252 | 0.929559 | 0.069730 | -0.500662 | 9127 Elizabeth Stravenue\nDanieltown, WI 06482... | 0 | 0 |
3 | -0.496719 | 1.220456 | -0.584986 | -0.189886 | 0.075327 | USS Barnett\nFPO AP 44820 | 0 | 1 |
4 | -0.813263 | -0.948927 | 0.200634 | -0.992999 | -1.723449 | USNS Raymond\nFPO AE 09386 | 0 | 0 |
df3.describe().T
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Avg. Area Income | 4990.0 | -1.242081e-15 | 1.000100 | -4.783945 | -0.669945 | 0.018812 | 0.675038 | 3.678300 |
Avg. Area House Age | 4990.0 | 1.231240e-16 | 1.000100 | -3.369390 | -0.658761 | -0.005282 | 0.679106 | 3.574860 |
Avg. Area Number of Bedrooms | 4990.0 | -4.534894e-17 | 1.000100 | -1.605481 | -0.682176 | 0.054849 | 0.411212 | 2.039145 |
Area Population | 4990.0 | -2.937752e-16 | 1.000100 | -3.635828 | -0.683094 | 0.002692 | 0.674915 | 3.374546 |
Price | 4990.0 | -7.796035e-17 | 1.000100 | -2.802583 | -0.671241 | -0.002958 | 0.678598 | 3.527482 |
House_size_Medium | 4990.0 | 5.100200e-01 | 0.499950 | 0.000000 | 0.000000 | 1.000000 | 1.000000 | 1.000000 |
House_size_Small | 4990.0 | 2.494990e-01 | 0.432766 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 |
문자열 처리 기능 추가
데이터셋의 주소를 나타내는 문자열 컬럼 Address
를 활용해 Zip 코드나 주(State)를 추출해 분석에 활용해보고자 합니다. 텍스트 마이닝과 자연어처리에 사용되는 파이썬 라이브러리 NLTK
의 Word Tokenizer
를 위에서 만든 파이프라인에 추가하여 사용해보도록 하겠습니다.
## 주소 데이터 예시
df.loc[0,'Address']
'208 Michael Ferry Apt. 674\nLaurabury, NE 37010-5101'
def extract_state(token):
return str(token[-2])
pipeline_tokenizer = pdp.TokenizeWords('Address')
pipeline_state = pdp.ApplyByCols('Address', extract_state, result_columns='State')
pipeline_state_extract = pipeline_tokenizer + pipeline_state
df4 = pipeline_state_extract(df3)
State
컬럼이 추가되었습니다!
df4.head()
Avg. Area Income | Avg. Area House Age | Avg. Area Number of Bedrooms | Area Population | Price | State | House_size_Medium | House_size_Small | |
---|---|---|---|---|---|---|---|---|
0 | 1.028113 | -0.300130 | 0.087245 | -1.322810 | -0.500532 | NE | 1 | 0 |
1 | 1.000175 | 0.023142 | -0.722671 | 0.401923 | 0.775998 | CA | 1 | 0 |
2 | -0.690443 | -0.115252 | 0.929559 | 0.069730 | -0.500662 | WI | 0 | 0 |
3 | -0.496719 | 1.220456 | -0.584986 | -0.189886 | 0.075327 | AP | 0 | 1 |
4 | -0.813263 | -0.948927 | 0.200634 | -0.992999 | -1.723449 | AE | 0 | 0 |
pdpipe 관련 글 목록
- pdpipe - Pandas DataFrame 전처리 자동화 01
- pdpipe - Pandas DataFrame 전처리 자동화 02
- pdpipe 공식 문서
- 데이터 과학을 위한 파이썬 라이브러리 모음
댓글남기기