오늘은 데이콘 댓글들을 많이 봤는데, 우리가 신경 써야 할 것들은 데이터 전처리와 모델링 둘 다였는데 모델링만 신경을 써왔어서 다시 데이터 전처리를 진행해보았다.

현우-승준

리안-시연으로 나뉘어서 진행하였는데

우리의 의견은 만약 a라는 subclass가 있다고 했을 때 그 암종을 결정하는 유전자 변이의 종류가 4300개 정도가 있는데, 그 빈도수를 측정하고 빈도수가 많은 것들만 선별하고, 나머지 데이터는 버려서 완벽한 모델을 만들기 보다는 조금 더 높은 점수를 받기 위한 작업을 진행하였다.

import pandas as pd
from sklearn.preprocessing import LabelEncoder, OrdinalEncoder
import xgboost as xgb
import numpy as np
import matplotlib.pyplot as plt
import os
import xgboost as xgb

from google.colab import drive

drive.mount('/content/drive')

train = pd.read_csv("/content/drive/MyDrive/open (1)/train.csv")
test = pd.read_csv("/content/drive/MyDrive/open (1)/test.csv")

# SUBCLASS 가 범주형이기 때문에 LabelEncoder 사용
le_subclass = LabelEncoder()
train['SUBCLASS'] = le_subclass.fit_transform(train['SUBCLASS'])

# 변환된 레이블 확인
for i, label in enumerate(le_subclass.classes_):
    print(f"원래 레이블: {label}, 변환된 숫자: {i}")
    
## x 의 경우도 범주형으로 구성되어 있어, 알맞은 인코딩 필요
X = train.drop(columns=['SUBCLASS', 'ID'])
# drop subclass , id 열, 그리고 나머지 모든 결과 X에 저장

y_subclass = train['SUBCLASS']
#subclass열만을 y_subclass에 저장

categorical_columns = X.select_dtypes(include=['object', 'category']).columns
ordinal_encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
X_encoded = X.copy()
X_encoded[categorical_columns] = ordinal_encoder.fit_transform(X[categorical_columns])

train_df = pd.read_csv('/content/drive/MyDrive/open (1)/train.csv')
train_df

test_df = pd.read_csv('/content/drive/MyDrive/open (1)/test.csv')
test_df

train_wt_columns = train_df.columns[(train_df == 'WT').all()].tolist()
test_wt_columns = test_df.columns[(test_df == 'WT').all()].tolist()

print('데이터셋에서 값이 모두 WT인 열 개수')
print('trainSet: ', len(train_wt_columns))
print('testSet: ', len(test_wt_columns))

cnt = 0
both_wt_columns = []
for gene in train_wt_columns:
  if gene in test_wt_columns:
    both_wt_columns.append(gene)
    cnt += 1

print('두 데이터셋에서 값이 모두 WT인 열 개수:', cnt)
both_wt_columns

trian_df = train_df.drop(columns=both_wt_columns)
trian_df

test_df = test_df.drop(columns=both_wt_columns)
test_df

train_wt_rows = train_df[(train_df.iloc[:, 2:] == 'WT').all(axis=1)]
test_wt_rows = test_df[(test_df.iloc[:, 1:] == 'WT').all(axis=1)]

print('데이터셋에서 값이 모두 WT인 행 개수')
print('trainSet: ', len(train_wt_rows))
print('testSet: ', len(test_wt_rows))

# 값이 모두 WT인 행을 찾아 train_df의 SUBCLASS 값을 'THYM'으로 변경
train_df.loc[(train_df.iloc[:, 2:] == 'WT').all(axis=1), 'SUBCLASS'] = 'THYM'

print('값이 모두 WT인 행의 라벨값 분포')
train_wt_rows['SUBCLASS'].value_counts().plot(kind='pie', autopct='%1.1f%%')

#아예 삭제? 혹은 그냥 냅두고 - 해보면 어떨까?
#THYM으로 학습해버리기? - 31%는 맞나?

train_df_melted = train_df.melt(id_vars=["ID", "SUBCLASS"], var_name="gene", value_name="value")
train_df_melted = train_df_melted[train_df_melted['value'] != 'WT']
train_df_melted

test_df_melted = test_df.melt(id_vars=["ID"], var_name="gene", value_name="value")
test_df_melted = test_df_melted.sort_values(by='ID')
test_df_melted

# 'ID'와 'SUBCLASS'를 제외한 열에 대해 모든 값이 'thym'인 행을 확인
thym_rows = (train.drop(columns=['ID', 'SUBCLASS']) == 'thym').all(axis=1)

# 'thym'인 행을 제외한 데이터셋 생성
train_filtered = train[~thym_rows]

# 결과 출력: 필터링된 데이터셋 확인
print(train_filtered.head())

# 'thym' 행이 제거된 데이터셋의 shape 확인
print(f"제거된 후 데이터셋 크기: {train_filtered.shape}")