데이터 받기
val_data = pd.read_csv('/kaggle/input/emotion-dataset/validation.csv')
train_data = pd.read_csv('/kaggle/input/emotion-dataset/training.csv')
test_data = pd.read_csv('/kaggle/input/emotion-dataset/test.csv')
print("Validation data :",val_data.shape)
print("Train data :",train_data.shape)
print("Test data :",test_data.shape)
half_test_data = test_data.iloc[1000:]
test_data = test_data.iloc[:1000]
val_data = pd.concat([val_data, half_test_data], axis=0)
print("new Vald data :",val_data.shape)
print("new Test data :",test_data.shape)
데이터 나누기
#테스트 데이터를 천개단위로 나누기
half_test_data = test_data.iloc[1000:]
test_data = test_data.iloc[:1000]
#검증데이터와 천개의 데이터합치기
val_data = pd.concat([val_data, half_test_data], axis=0)
print("new Vald data :",val_data.shape)
print("new Test data :",test_data.shape)
label값에 따른 내용 붙여주기
labels_dict = {0:'sadness', 1:'joy', 2:'love', 3:'anger', 4:'fear', 5:'surprise'}
train_data['label_name'] = train_data['label'].map(labels_dict)
train_data.head()
groupby로 각라벨의 갯수출력하기
train_data.groupby(["label_name","label"]).size()
#시각화
train_data["label_name"].value_counts().plot(kind='bar',color=['yellow', '#0c0d49', '#b82f2f', '#331e1e', 'red','#00fff7'])
결측치 출력
print(train_data.isnull().sum())
print(val_data.isnull().sum())
print(test_data.isnull().sum())
토큰나이저
# Tokenizer().fit_on_texts는 텍스트에 숫자를 매핑해주는 코드
#word_index는 토큰화된 데이터를 딕셔너리로 만들어주는 코드
#stemmer.stem은 어간 추출방식임 (형태소분석의 일종임)
tokenizer1 = Tokenizer()
tokenizer1.fit_on_texts(all_list)
word_index1 = tokenizer1.word_index
print("Nombre of words without Stemming:",len(word_index1))
stemmer = PorterStemmer()
stemmed_words = [stemmer.stem(word) for word in word_index1.keys()]
tokenizer2 = Tokenizer()
tokenizer2.fit_on_texts(stemmed_words)
word_index2 = tokenizer2.word_index
print("Nombre of words with Stemming:",len(word_index2))
#data.interrows는 데이터를 하나의 객체로 묶어두는 코드임 (일반적으로 반복문을 통해서 빼내는 역활을 함)
#texts_to_sequences는 토크나이저에있는 딕셔너리로 값을 매핑해줌
def preprocess_data(data):
new_data = []
for index, row in data.iterrows():
test_split = row['text'].split()
stemmed_words2 = [stemmer.stem(word) for word in test_split]
token_list= tokenizer2.texts_to_sequences([stemmed_words2])[0]
new_data.append([token_list,row['label']])
return new_data
매핑된 숫자에 가장큰 수를 가져오기
train_X = [row[0] for row in new_train_data]
train_y = [row[1] for row in new_train_data]
length_of_longest_sentence = len(max(train_X, key=len))
print(length_of_longest_sentence)
print(max(train_X, key=len))
원 핫 인코딩
# Convert labels to one-hot encoding
train_y_one_hot = to_categorical(train_y, num_classes=16000)
val_y_one_hot = to_categorical(val_y, num_classes=16000)
모델학습
# Embedding은 단어를 100개의 숫자로 표현하는 방식임
숫자 16000은 단어의 최대갯수를 의미
66은 입력할 차원수를 의미
model = Sequential()
model.add(Embedding(16000, 100, input_length=66))
model.add(Bidirectional(LSTM(150)))
model.add(Dense(16000, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(train_X, train_y_one_hot, epochs=25, verbose=1,validation_data=(val_X,val_y_one_hot))
#print model.summary()
print(model)
'캐글 코드' 카테고리의 다른 글
캐글 우주 타이타닉 예측 1탄 (0) | 2024.02.23 |
---|---|
캐글 자전거 수요예측 (0) | 2024.02.22 |
캐글 SMS Spam Collection Dataset 2탄 (0) | 2024.01.31 |
캐글 SMS Spam Collection Dataset 1탄 (0) | 2024.01.31 |
캐글 NLP 뉴스데이터 분석 1탄 (0) | 2024.01.29 |