금요일 저녁에 운동을 가야 했는데, 집에서 누워 있다가 결국 못가고 잠이 들었다. 토요일에는 오랜만에 아내와 함께 로봇 조립 가서 정신없이 보내고 오후에 집에 와서 낮잠 자고, 저녁에 산책 가서 1.5리터 맥주 가져와서 맥주 마시고 기절. 일요일에는 아침에 일어나서 책보고 하다가 도서관 다녀오고 낮잠 자고 나니까 저녁이네. 이번 주말에는 틈날때마다 코틀린 코딩한 것 말고는 좀 여유 있게 쉬었다. 오늘 오후에는 아내 옆에서 책 읽다가 기절해서 소파에서 자고 일어난 것 말고는 괜찮았다.

아내가 왜 요즘 성당 안가냐고 타박을 준다. 어머니 생각이 나면 성당에 가기 싫어지고 우울증이 온다. 최근에 우울증이 올 정도로 미친듯이 일했던 기억이 나서 더욱 그런지도 모르겠다. 화요일에는 셋째 학교 상담을 가야 해서 오후 반차를 냈다. 아직 1.5일 휴가가 남아 있기는 한데, 틈날때마다 사용하면 될 것 같다. 셋째가 11월 16일 수능을 보다 보니, 당분간은 어디 가기 힘들 것 같고 논술 전형 일정 끝나면 같이 바닷가라도 다녀오려고 생각중이다. 나도 아이도 갑갑한 요즘이다.

반응형

 여의도 콘라드 호텔에서 한다고 해서 참석해서 알테어 제품에 대한 설명과 PWC 컨설턴트의 최근 트렌드에 대한 설명을 들었다.

 

https://web.altair.com/altair-finance-dx-meet-up-korea

반응형

 아래 사이트에서 코드에 필요한 공식과 개념을 이해했다. 공식에 대해서는 피상적으로 이행하는 것과 실제 그것을 구현하는 것이 얼마나 차이가 있는지 알 수 있었던 좋은 기회이지 싶다.

https://medium.com/data-science-in-your-pocket/how-feature-importance-is-calculated-in-decision-trees-with-example-699dc13fc078

 

How feature importance is calculated in Decision Trees? with example

Understanding the math behind

medium.com

1. 필요한 라이브러리 불러오기

import pandas as pd

from sklearn.tree import DecisionTreeClassidifer

from sklearn.tree import export_text

import torch

 

2. train_data를 이용하여 Decision Tree model 생성

clf=DecisionTreeClassifier(random_state=2, max_depth=5, min_samples_split=2000, min_samples_leaf=10000)

clf.fit(X_train, y_train)

# 전체 모델 로직 확인

r=export_text(clf, feature_names=list(X_train.columns))

print(r)

torch.save(clf, "/DecisionMgmt/kp19983/dctl_v0_3.torch")

 

3. Model을 불러와서 수기로 계산


clf = torch.load("/DecisionMgmt/kp19983/dctl_v0_3.torch")

dtree = clf.tree_

# X_train 데이터 길이 확인
print(len(X_train))

df_t = pd.DataFrame(columns=['node', 'size', 'importance']

for i in range(dtree.node_count):
    node = i
    size = dtree.n_node_samples[i]
    if (dtree.children_left[i] == -1) and (dtree.children_right[i] == -1):
        importance = 0
    else:
        importance = (dtree.n_node_samples[i] / len(X_train) * dtree.impurity[i]) \
            - (dtree.n_node_samples[dtree.children_left[i]] / len(X_train)) * dtree.impurity[dtree.children_left[i]] \
            - (dtree.n_node_samples[dtree.children_right[i]] / len(X_train)) * dtree.impurity[dtree.children_right[i]]
    df_t=df_t.append({'node': node, 'size': size, 'importance': importance}, ignore_index = True)

df_t['node'] = df_t['node'].as_type(int)
df_t['size'] = df_t['size'].as_type(int)

# 수기로 계산된 각 노드별 feature_importance sum
print(df_t.sum())

# sklearn.DecisionTreeClassifier에서 제공하는 feature_importance DataFrame 생성
importances = clf.feature_importances_

feature_importances = pd.concat([pd.DataFrame(X_train.columns), pd.DataFrame(importances)], axis=1)
feature_importances.columns = ['feature_nm', 'importances']
feature_importances['calc_impt'] = feature_importances['importances'] * df_t.importance.sum()
feature_importances = feature_importances[feature_importances.importances > 0]
feature_importances.sort_values(by = ['importances'], ascending=False, inplace = True, ignore_index = True)

print(feature_importances)

# Sub Tree Model
fnl_xlist = feature_importances['feature_nme'].tolist()

df2 = pd.concat([df, pd.DataFrame(clf.apply(df[fnl_xlist], check_input=True), columns=['NODE']], axis = 1)

node6 = df2[df2['NODE']==6]
node6_X = node6[fnl_xlist]
node6_y = node6['TARGET']

clf_sub = DecisionTreeClassifier(random_state = 2, max_depth=3, min_samples_split = 20, min_samples_leaf = 20000)
clf_sub.fit(node6_X, node6_y)

dtree = clf_sub.tree_

torch.save(clf_sub, "/DecisionMgmt/kp19983/dctl_v0_3.torch")

clf_sub = torch.load("/DecisionMgmt/kp19983/dctl_v0_3.torch")

node6_df_t = pd.DataFrame(columns=['node', 'size', 'importance'])

for i in range(dtree.node_count):
    size = dtree.n_node_samples[i]
    if (dtree.children_left[i] == -1) and (dtree.children_right[i] == -1):
        importance = 0
    else:
        importance = (dtree.n_node_samples[i] / len(X_train) * dtree.impurity[i]) \
            - (dtree.n_node_samples[dtree.children_left[i]] / len(X_train)) * dtree.impurity[dtree.children_left[i]] \
            - (dtree.n_node_samples[dtree.children_right[i]] / len(X_train)) * dtree.impurity[dtree.children_right[i]]
    node6_df_t=node6_df_t.append({'node': node, 'size': size, 'importance': importance}, ignore_index = True)

node6_df_t['node'] = node6_df_t['node'].astype(int)
node6_df_t['size'] = node6_df_t['size'].astype(int)

print(node6_df_t)

node6_importances.columns = ['feature_nm', 'importances']
node6_feature_importances['calc_impt'] = node6_feature_importances['importances'] * node6_df_t.importance.sum()
node6_feature_importances = node6_feature_importances[node6_feature_importances.importances > 0]
node6_feature_importances.sort_values(by = ['importances'], ascending=False, inplace = True, ignore_index = True)

print(node6_feature_importances)

comb_feature_importances=pd.merge(feature_importances[['feature_nm', 'calc_impt']],
                                  node6_feature_importances.rename(columns = {'calc_impt': 'sub_calc_impt'})[['feature_nm', 'sub_calc_impt']],
                                  how='outer',
                                  on = ['feature_nm'],
                                  validate='m:m')

comb_feature_importances.fillna(0, inplace=True)
comb_feature_importances['fnl_calc_impt'] = comb_feature_importances['cal_impt'] + comb_feature_importances['sub_calc_impt']
comb_feature_importances['importances'] = comb_feature_importances['fnl_calc_impt'] / comb_feature_importances['fnl_calc_impt'].sum()
comb_feature_importances.sort_values(by = ['fnl_cal_impot'], ascending=False, inplace = True, ignore_index = True)

print(comb_feature_importances)

from matplotlib.pyplot as plt

plt.figure(figsize = (14, 10))
plt.title('Combined Feature Importances Top')
sns.barplot(x = comb_feature_importances.importances, y = comb_feature_importances.feature_nme)
반응형

'Python, PySpark' 카테고리의 다른 글

pm4py  (0) 2023.10.31
Python 날짜 스트링 전처리  (0) 2023.08.16
파이썬 한권으로 끝내기 - 234페이지 (credit_final.csv)  (0) 2023.05.28
rownumber() over () in python pandas  (0) 2023.05.01
cosine similarity 계산  (0) 2023.04.12

 원래 이런 입문서는 자잘한 오류가 많다. 아니면 중간에 설정이 변경되어서 더 이상 예전 버전의 옵션이 돌아가지 않는 것일 수도 있고 말이다.

 

1. Select a Project Template 에서는 "Empty View Activity"를 선택해라 그렇지 않으면 주요 Source 코드 들이 나오지 않는다.

2. 실행했을 때, "Update this project to use a newer compileSdk of at least 34, for example 34"이라는 문구가 나오면, 아래와 같이 하면 된다. File - Project Structure를 눌러준다.

 

Android Studio - File - Project Structure

3. 화면에서 "Compile Sdk Version"을 선택해서 "34"를 선택하면 된다. 이거 몰라서 헤맸던 시간이 많다. 

Compile Sdk Version

5. MainActivity.kt : 여기서 조심해애 할 것은 아래 코드를 입력할 때 전체를 다 입력해야 하고, "setContentView(binding.root)"를 먼저 입력하면 자동으로 문법이 잡힌다는 것이다. 이것 모르고 그냥 하다가 시간 많이 잡아 먹었다.

val binding = ActivityMainBinding.inflate(layoutInflater)

 여기는 전체 코드

package kr.co.hanbit.sayhello

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kr.co.hanbit.sayhello.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.btnSay.setOnClickListener {
            binding.textSay.text="Hello Kotlin!!!"
        }
    }
}

 

6. build.grade.kts (:app) 에서 아래 부분을 추가해야 합니다. 책과는 달리 viewBinding=True를 입력해 주셔야 합니다. 책에는 중간에 "="가 없는데, 이게 없으면 에러 납니다. 저 이거 못찾아서 한참을 헤맸습니다.

 

7. 그리고 마지막에 실행하면 녹색 버튼을 누르면 실행이 됩니다. 

실행 버튼은 위의 플레이 버튼입니다.

8. 가장 중요한 것 : Device Manager에서 "Running Devices:" 밑에 있는 전원 버튼을 꼭!!! 눌러 주셔야 합니다. 저 이거 몰라서 이거 왜 안되지 하다가 우연히 눌러보고 된다는 것을 알았습니다.

 생각보다 책이 자세히 나와 있고 중간 중간 못찾는 부분은 구글로 검색해서 유튜브로 보시면 바로 알게 되더군요. 가끔 설명하는 분이 영어나 스페인어를 써서 그렇지 구글 + 유튜브이면 왠만한 것들은 다 찾을 수 있어서 좋았습니다. :) 앞으로도 간간이 올리도록 하겠습니다.

반응형

 코틀린에는 타입 확인할 수 있는 함수가 없어서 검색하다보니, 이런게 나오네?

검색해서 밑에 부분만 읽고 열심히 코딩했다가, 계속 에러가 나서 보니 위에서 함수를 만들어야 했던 것이었다. 그래서 파바박 코딩해서 해보니 생각보다 잘 나오는구만.

 예전에는 SAS 만 써서 다른 것은 R밖에 몰랐는데, 파이썬을 2년 정도 열심히 사용하다보니 왠만한 것은 그냥 파이썬 찾아서 라이브러리 불러오면 다 있던데. 파이썬으로 앱이나 웹을 만드는 것은 아무래도 무리겠지.

 

https://www.tutorialspoint.com/equivalent-of-getclass-for-kclass-in-kotlin

 

Equivalent of getClass() for KClass in Kotlin

Equivalent of getClass() for KClass in Kotlin - In this article, we will take an example and demonstrate how we can obtain the class reference in Kotlin. Kotlin does not support fetching the class reference directly, but you can obtain the same reference v

www.tutorialspoint.com

import kotlin.reflect.KClass

fun main() {
    fun<T: Any> T.getClass(): KClass<T> {
        return javaClass.kotlin
    }
   
    val aToz = 'a'..'z'

    val isTrue = 'c' in aToz
    println(aToz)
    println("isTrue = 'c' in aToz : $isTrue")
    for (t in 'a'..'z') {
       print("$t, ")
    }
    println()

    val oneToTen = 1..10

    for (k in oneToTen) {
        for (j in 1..5) {
            println("k * j = ${k * j}")
        }
    }
    print("type of aToz: ${oneToTen.getClass().simpleName}")
    //for (t in aToz) {
    //    print("$t, ")
    // }
    // println()
}
반응형

'C, C++, Java' 카테고리의 다른 글

Java의 정석 2장  (0) 2016.12.11
Score cut-off C++ program  (0) 2014.09.05
Overriding1.cpp  (0) 2014.05.02
CReference2.cpp  (0) 2014.05.02
P304.cpp  (0) 2014.05.02

겨울에 감기 걸려서 아픈게 싫어서 말이지. 근데 몸이 아프기는 되게 아프다. 독감 예방 주사인데 이렇게 아파도 되는 건가, 내일 운동 쉬어야 되는데. 아이고 어질어질 하기는 하구나.

반응형

+ Recent posts