1. concat
concat 시 X, X_submission으로 해야함 -> X,Y 아님
인덱싱 관련 오류
-> 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{} 안 해도 됨
이 오류 발생시 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})
'빅데이터 분석기사 > 작업 유형 2 (ML)' 카테고리의 다른 글
고객 구매 데이터로 성별예측 모형 (2) | 2023.06.07 |
---|---|
이항분류 성능평가, 예측값 저장 (0) | 2023.06.06 |
이항분류 모델링(lr, knn, dt, rf, xgb) (0) | 2023.06.06 |
이항분류 파생변수 생성, 스캐일링 (0) | 2023.06.06 |
충분한 데이터의 중요성 (0) | 2023.06.06 |