전처리가 쉬워지는 판다스 파이프라인

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 ScalingMin-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 공식 문서
- 데이터 과학을 위한 파이썬 라이브러리 모음
댓글남기기