빅데이터 분석기사/작업 유형 2 (ML)

빅데이터분석기사 2유형 주의할 점, 실수하기 좋은 점, 많이 뜨는 오류

유방울 2023. 6. 17. 13:27

1. concat 

concat 시 X, X_submission으로 해야함 -> X,Y 아님

concat() got multiple values for argument 'axis'

인덱싱 관련 오류

-> X, X_submission은 꼭 인덱싱 해야함

dfX = pd.concat([X, X_submission],axis=0,ignore_index=True)

2. Y 분포 확인해보기 

Y.value_counts('Segmentation',normalize=True).sort_values(ascending=False)

3. 라벨인코딩

라벨인코딩 사용시

astype('category').cat.codes 사용 !!

feature = ['Gender','Ever_Married','Graduated','Profession','Spending_Score','Var_1']
for x in feature:
  dfX[x] = dfX[x].astype('category').cat.codes
print(dfX)
print(dfX.info())

4. get_score 함수

A 는 train, B는 test -> 과적합 확인

그 다음 pred, C는 문제에 제시된 평가지표 사용

출력은 A,B,C 만 하기

make_model에서 사용하는 거기 때문에 data가 아니라model로 적어야 함

def get_score(model,xtrain,xtest,ytrain,ytest):
  A = model.score(xtrain,ytrain)
  B = model.score(xtest,ytest)
  ypred = model.predict(xtest)
  C = f1_score(ytest,ypred, average='macro')
  return (f'{A:.4f},{B:.4f},{C:.4f}')

5. get_score 함수

model 3번 들어가고 각 모델에 맞게 숫자 바꿔줘야함 model1, model2 ...

print시 실수가 아니니 f{} 안 해도 됨

name 'rf' is not defined

이 오류 발생시 dt때 쓴 거 rf에 복붙했을 때 for 문에서 df를 rf로 변경했는지 확인하기

def make_model(xtrain,xtest,ytrain,ytest):
  model1 = LogisticRegression().fit(xtrain,ytrain)
  print('model1',get_score(model1,xtrain,xtest,ytrain,ytest))

  for dt in range(3,8):
    model2 = DecisionTreeClassifier(max_depth= dt,random_state=0).fit(xtrain,ytrain)
    print('model2', dt ,get_score(model2,xtrain,xtest,ytrain,ytest))

  # dt 복붙하고 제대로 확인하기
  for rf in range(3,8):
    model3 = RandomForestClassifier(max_depth= rf, random_state=0).fit(xtrain,ytrain)
    print('model3', rf ,get_score(model3,xtrain,xtest,ytrain,ytest))

  for k in range(2,10):
    model4 = KNeighborsClassifier(k).fit(xtrain,ytrain)
    print('model4',k,get_score(model4,xtrain,xtest,ytrain,ytest))

6. get_data

이 함수 주의 주의 주의 주의

어려움 ㅠㅠ

X 칼럼에서 안 쓰는 컬럼 ID 삭제하기

이 함수에서 X1_use, X1_submission 처럼 1 붙이지 말기 - Y는 제외

why?

pred = model.predict(X1_submission)

submission = pd.DataFrame({'ID':X1_submission,{'prediction:pred'}})

여기서 오류 뜸 

why?

만약 X1_submission 으로 됐을 때 스케일링이 되어서 넘파이 형식으로 df 생성할 때 오류 뜬다.

def get_data(dfX,Y):
  X = dfX.drop(columns=['ID'])
  scaler = MinMaxScaler()
  X_scaled =  scaler.fit_transform(X)
  X_use = X_scaled[:6665,:]
  X_submission = X_scaled[6665:,:]
  Y1 = Y['Segmentation']
  print(X_use.shape, X_submission.shape, Y1.shape)
  return X_use, X_submission, Y1

7. 데이터 분할 및 학습

random_state = 0은 같은 결과 반환을 위해 추가하기

get_data(dfX,Y)임 기억하기

X1_use,X1_submission,Y1 = get_data(dfX,Y)
#random_state=0 넣어주기
xtrain,xtest,ytrain,ytest = train_test_split(X1_use, Y1, test_size=0.3,stratify=Y1,random_state=0)
make_model(xtrain,xtest,ytrain,ytest)

8. 파일 제출하기 

정석

ypred = final_model.predict(X1_submission)
submission = pd.DataFrame({'ID':X_submission['ID'],
                           'Segmentation':ypred})

만약 계속 X_submission이 넘파이라는 오류 뜬다면 dfX 에서 직접 iloc 인덱싱 사용하기 

ypred = final_model.predict(X1_submission)
submission = pd.DataFrame({'ID':dfX.iloc[6665:,:]['ID'],
                           'Segmentation':ypred})