인프런 커뮤니티 질문&답변

shinheesung1님의 프로필 이미지
shinheesung1

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

시험환경 살펴보기 (구 버전)

[시험환경에 적응하기:작업형2] 'DataConversionWarning'이유 알려주세요

해결된 질문

작성

·

671

0

작업형2를 아래와 같이 했는데

DataConversionWarning 나왔습니다

검색해보니 y_train 변경때문이며 ravel()을 사용하라고

하는데 이유 설명 부탁 드립니다

[error명]

DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().

[작성내용]

import pandas as pd

X_test = pd.read_csv("data/X_test.csv")

X_train = pd.read_csv("data/X_train.csv")

y_train = pd.read_csv("data/y_train.csv")

pd.set_option('display.max_columns',None)

# 사용자 코딩

#print(X_train.shape,X_test.shape,y_train.shape)

#print(y_train.isnull().sum())

#print(X_train['환불금액'].describe())

X_train['환불금액']=X_train['환불금액'].fillna(X_train['환불금액'].mean())

X_test['환불금액']=X_test['환불금액'].fillna(X_train['환불금액'].mean())

#print(X_train.isnull().sum())

X_train=X_train.drop('cust_id',axis=1)

X_test_id=X_test.pop('cust_id')

y_train=y_train.drop('cust_id',axis=1)

#print(X_test.head(2))

#print(X_train.select_dtypes(exclude='object').columns)

# '주구매상품', '주구매지점'

# '총구매액', '최대구매액', '환불금액', '내점일수', '내점당구매건수', '주말방문비율', '구매주기'

from sklearn.preprocessing import LabelEncoder

cols=['주구매상품', '주구매지점']

for col in cols:

le=LabelEncoder()

X_train[col]=le.fit_transform(X_train[col])

X_test[col]=le.transform(X_test[col])

#print(X_train.head())

from sklearn.preprocessing import MinMaxScaler

cols2=['총구매액', '최대구매액', '환불금액', '내점일수', '내점당구매건수', '주말방문비율', '구매주기']

scaler=MinMaxScaler()

X_train[cols2]=scaler.fit_transform(X_train[cols2])

X_test[cols2]=scaler.transform(X_test[cols2])

#print(X_train.head(2))

from sklearn.model_selection import train_test_split

X_tr,X_val,y_tr,y_val=train_test_split(X_train,y_train, test_size=0.3, random_state=2023)

#print(X_tr.shape,X_val.shape,y_tr.shape,y_val.shape)

#(2450, 9) (1050, 9) (2450, 1) (1050, 1)

from sklearn.metrics import roc_auc_score

from sklearn.ensemble import RandomForestClassifier

rf=RandomForestClassifier(random_state=2023)

rf.fit(X_tr,y_tr)

pred=rf.predict_proba(X_val)

print(roc_auc_score(y_val,pred[:,1]))

#0.654227735236709

 

답변 1

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

결론부터 이야기 하면 아래와 같이 코드를 변경하면 워닝 없이 진행됩니다.

# y_train=y_train.drop('cust_id',axis=1)
y_train=y_train['gender']
  • 원인: 사이킷럿 fit(X, y) -> y, 학습할 때 y는 1차원 형태인 시리즈 형태여야 합니다. 그런데 drop으로 반환을 받게 되면 데이터프레임을 반환받아 2차원 형태의 데이터프레임으로 y가 생성됩니다.

  • 현상: 예측 결과는 정상적으로 작동하나 워닝(DataConversionWarning)이 발생합니다.

  • 해결방안: y 데이터를 대입할 때는 drop이 아닌 해당 변수를 지정해서 담아주세요!

화이팅입니다:)

 

shinheesung1님의 프로필 이미지
shinheesung1
질문자

감사합니다

shinheesung1님의 프로필 이미지
shinheesung1

작성한 질문수

질문하기