해결된 질문
작성
·
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이 아닌 해당 변수를 지정해서 담아주세요!
화이팅입니다:)
감사합니다