728x90
반응형

32bit 개발환경으로 변경해야 되는 이유

PC 등에서 공개 데이터(기상, 대기질, 증권 등)를 수집하기 위해서는 각 서버의 API를 사용해야 합니다. 이때, API 개발 환경의  bit 수를 맞춰줘야 합니다. 즉, 윈도우 OS Anaconda 64bit 환경에서 32bit API를 다룰려고 하면 Error가 발생합니다. 따라서,  아래와 같이 32-bit 개발 환경으로 변경하여야 됩니다. 이 방법의 장점은 아래와 같습니다. 

   1. 32bit 윈도우를 재설치할 필요없이 64bit 윈도우에서 개발 환경 설정 가능

   2. 32bit 아나콘다 재설치 필요없이 64bit 아나콘다에서 개발 환경 설정 가능

 

방법

1. Anaconda Prompt 에서 아래 과정 수행

    (base) C:\Users\chpark> conda --version

    conda 4.12.0

    (base) C:\Users\chpark> python --version

    Python 3.9.12

 

    (base) conda info

              :   

        platform : win-64  로 확인됨.

              : 

 

2. 32bit 로 아나콘다 환경 변경

    (base) C:\Users\chpark>set CONDA_FORCE_32BIT=1     

      위 명령을 수행하면 아무 반응이 없습니다. 주의할 점은 32BIT=1 사이에 공백이 없어야 합니다. set CONDA_FORCE_32BIT=0 를 입력하면 다시 64bit로 돌아옵니다. 아래와 같이 아나콘다 bit를 확인할 수 있습니다. 

    (base) conda info

            :     

        platform : win-32  로 변경되었는지 확인

            : 

3.  32bit 개발을 위한 가상환경을 설정

    (base) C:\Users\chpark>conda create -n py39_32 python=3.9.12 anaconda

    (base) C:\Users\chpark>conda activate py38_32 

    (py39_32) C:\Users\chpark> conda info

            아래 결과와 같이 platform : win-32  임이 확인되면 완성입니다. 

 

PyQt5 설치

32bit PyQt5를 설치하려면 위에서 생성된 가상환경 py39_32에서

    (py39_32) C:\Users\chpark>   pip install pyqt5 

를 실행하면 됩니다. 

 

 

가상환경 IDE에 연결하기

PyCharm 등의 IDE에 위에서 생성한 가상환경을 연결하면 됩니다. 

 

 

 

 

 

 

참고문헌: https://steady-coding.tistory.com/270

728x90
반응형
728x90
반응형

1. PyCharm 설치

 

2. 웹스크래핑과 판다스

import requests
from beautifulsoup4 import beautifulsoup

#url = "http://www.naver.com"
url = "https://finance.naver.com/item/main.nhm?code=000660"
html = requests.get(url).text  # 웹페이지 주소를 requests 모듈의 get()메서드에 전달
soup = BeautifulSoup(html, "html5lib")

 

from bs4 import BeautifulSoup 실행시 오류나면, 아래와 같이 설치

 

(base) conda install bs4

 

728x90
반응형
728x90
반응형

 

11. 지면상태 관측

11.1 개요 (1) 지면은 습하거나 건조한 정도에 따라 태양열을 받아들이는 정도가 다르므로 지면온도의 상승 등에 영향을 주어 상층대기 구조에도 영향을 미치게 된다. (2) 지면상태는 다음과 같이 WMO Code 0901과 0975에 의해 관측한다. 11.2 관측 (1) 지면이 눈 또는 측정 가능한 얼음으로 덮여 있지 않을 때 0. 지표면이 건조(지면에 균열이 없으며, 모래 먼지는 일어나지 않음) 1. 지표면이 습윤함 2. 지표면에 물이 고여 있음(지표면에 크고 작은 물웅덩이가 생김) 3. 지표면에 유수가 있음 4. 지표면이 얼어있음 5. 지표면이 빙막으로 덮여 있음 6. 지표면은 건조된 먼지 또는 모래로 덮여 있으나 완전히 덮여 있지는 않음 7. 지표면은 건조된 먼지 또는 모래로 얇게 완전히 덮여 있음 8. 지표면은 건조된 먼지 또는 모래로 보통 또는 두껍게 덮여 있음 9. 지표면이 대단히 건조하여 균열이 있음 ※ 숫자부호 0~2와 4는 대표적인 맨땅에 적용하고 3 또는 5~9는 광범위한 지역에 적용한다. (2) 지면이 눈 또는 측정 가능한 얼음으로 덮여 있을 때 10. 지표면이 얼음으로 거의 덮여 있음 11. 지표면의 1/2 미만이 다져진 눈 또는 습성눈(얼음의 유무에 관계없이) 으로 덮여 있음 12. 지표면의 1/2 이상이 다져진 눈 또는 습성눈(얼음의 유무에 관계없 이)으로 덮여 있으나 완전히 덮인 상태는 아님 13. 지표면은 다져진 눈 또는 습성눈으로 균일하게 완전히 덮인 상태 14. 지표면은 다져진 눈 또는 습성눈으로 불균일하게 완전히 덮인 상태 15. 지표면의 1/2 미만이 푸석푸석한 건성눈으로 덮인 상태 16. 지표면의 1/2 이상이 푸석푸석한 건성눈으로 불균일하게 덮인 상태 (완전히 덮인 상태는 아님)17. 지표면이 푸석푸석한 건성눈으로 균일하게 완전히 덮인 상태 18. 지표면이 푸석푸석한 건성눈으로 불균일하게 완전히 덮인 상태 19. 지표면이 눈으로 두껍게 완전히 덮인 상태 ※ 광범위한 지역에 적용한다. ※ 눈 이외의 고체상 강수를 포함한다

 

출처:

기상청 전자도서관 - 지상기상관측지침 - [33393_지상기상관측지침(2016.7).pdf] (kma.go.kr)

728x90
반응형
728x90
반응형
 ! File: solve_heat_diffusion_v1.f90
! Purpose: OOP implementation in Fortran of the ADE method of Barakat & Clark
!          (1966), for solving the time-dependent heat-diffusion equation in 2D,
 !          with a linearly-varying temperature profile on the domain-boundaries.
 !NOTES: - (for gfortran users): gfortran-4.8 still had no support for
 !         'final'-methods, and an error will be raised by that version (or
 !         earlier) of that compiler; HOWEVER, the final-procedure can be safely
 !         removed in our case, since it is included for demonstration-purposes
  !         only (the arrays which it de-allocates are freed anyway by the runtime
  !         system, when the 'Solver'-instance goes out of scope). Comment
  !         corresponding line below, to disable use of this feature.
 !       - The file "config_file_formatted.in", containing the parameters for the
 !         solver, needs to be located in working directory.
 !       - Lines containing only comments with dots can be ignored (they just
 !         help with including code in TeX-files).
 
 17 module NumericKinds
 18   implicit none
 
    ! KINDs for different types of REALs
 21   integer, parameter :: &
        R_SP = selected_real_kind(  6,   37 ), &
        R_DP = selected_real_kind( 15,  307 ), &
       R_QP = selected_real_kind( 33, 4931 )
   ! Alias for precision that we use in the program (change this to any of the
   ! values 'R_SP', 'R_DP', or 'R_QP', to switch to another precision globally).
 27   integer, parameter :: RK = R_DP ! if changing this, also change RK_FMT
 
    ! KINDs for different types of INTEGERs
 30   integer, parameter :: &
         I1B = selected_int_kind(2), & ! max = 127
         I2B = selected_int_kind(4), & ! max ~ 3.28x10^4
         I3B = selected_int_kind(9), & ! max ~ 2.15x10^9
         I4B = selected_int_kind(18)   ! max ~ 9.22x10^18
    ! Alias for integer-precision (analogue role to RK above).
 36   integer, parameter :: IK = I3B

    ! Edit-descriptors for real-values
 39   character(len=*), parameter :: R_SP_FMT = "f0.6", &
         R_DP_FMT = "f0.15", R_QP_FMT = "f0.33"
    ! Alias for output-precision to use in the program (keep this in sync with RK)
 42   character(len=*), parameter :: RK_FMT = R_DP_FMT
 43 end module NumericKinds

 45 module Config_class
 46   use NumericKinds
 47   implicit none
 48   private

 50   type, public :: Config
 51      real(RK) :: mDiffusivity = 1.15E-6_RK, & ! sandstone
            ! NOTE: "physical" units here (Celsius)
	      mTempA = 100._RK, &
            mTempB =  75._RK, &
            mTempC =  50._RK, &
            mTempD =  25._RK, &
			          mSideLength = 30._RK
 58      integer(IK) :: mNx = 200 ! # of points for square side-length
 59   end type Config

    ! Generic IFACE for user-defined CTOR
 62   interface Config
 63      module procedure createConfig
 64   end interface Config

 66 contains
 67   type(Config) function createConfig( cfgFilePath )
 68     character(len=*), intent(in) :: cfgFilePath
 69     integer :: cfgFileID
 70     open( newunit=cfgFileID, file=trim(cfgFilePath), status='old', action='read' )
      ! .....................................................
 72     read(cfgFileID,*) createConfig%mTempA
 73     read(cfgFileID,*) createConfig%mTempB
 74     read(cfgFileID,*) createConfig%mTempC
 75     read(cfgFileID,*) createConfig%mTempD
 76     read(cfgFileID,*) createConfig%mNx
 77     read(cfgFileID,*) createConfig%mDiffusivity
 78     read(cfgFileID,*) createConfig%mSideLength
 79     close(cfgFileID)
 80   end function createConfig
 81 end module Config_class
 
 83 module Solver_class
 84   use NumericKinds
 85   use Config_class
 86   implicit none
 87   private

 89   type, public :: Solver
 90      private ! Hide internal-data from users.
 91      type(Config) :: mConfig
 92      real(RK) :: mNt, & ! # of iterations to simulate a characteristic time
            mDx, mDt, mA, mB ! Configuration-dependent factors.
 94      real(RK), allocatable, dimension(:,:) :: mU, mV ! main work-arrays
 95      integer(IK) :: mNumItersMax, mCurrIter = 0
 96    contains
 97      private ! By default, hide methods (and expose as needed).
 98      procedure, public :: init
 99      procedure, public :: run
100      procedure, public :: writeAscii
101      procedure, public :: getTemp
 ! Internal methods (users don't need to know about these).
103      procedure :: advanceU
104      procedure :: advanceV
    !final :: cleanup ! NOTE: may need to comment-out for gfortran!
106   end type Solver

108	contains
 subroutine init( this, cfgFilePath, simTime ) ! initialization subroutine
110     class(Solver), intent(inout) :: this
111     character(len=*), intent(in) :: cfgFilePath
112     real(RK), intent(in) :: simTime
  ! .....................................................
114     integer(IK) :: nX, i, j
115     real(RK) :: lambda

117     this%mConfig = Config( cfgFilePath ) ! call component CTOR
118     nX = this%mConfig%mNx ! for making code below more compact
     ! conservative choice for N_t, to resolve transients -- see Barakat & Clark (1966)
120     this%mNt = nX**2
     ! evaluate derived parameter 'mLambda' in Solver, based on configuration
122     this%mNumItersMax = int( simTime*this%mNt )
123     this%mDx = 1. / nX
124     this%mDt = 1. / this%mNt
125     lambda = (2.*this%mDt) / (this%mDx**2)
126     this%mA = (1.-lambda)/(1.+lambda)
127     this%mB = lambda/(2.*(1.+lambda))
     ! allocate memory for internal arrays
129     allocate( this%mU(0:nX, 0:nX), this%mV(0:nX, 0:nX) )
     ! initialize mU-field:
     ! - set initial temperature everywhere...
132     this%mU = 1.
     ! - BUT re-write @ boundaries, for correct BCs
     ! -- North
135     this%mU(:, nX) = [ (1./3.*(i/real(nX, RK))+2./3., i=0,nX) ]
     ! -- West
137     this%mU(0, :) = [ (1./3.*(j/real(nX, RK))+1./3., j=0,nX) ]
     ! -- South
139     this%mU(:, 0) = [ (-1./3.*(i/real(nX, RK))+1./3., i=0,nX) ]
     ! -- East
141     this%mU(nX, :) = [ (j/real(nX, RK), j=0,nX) ]
     ! initialize mV-field (from mU-field)
143     this%mV = this%mU
144   end subroutine init

146   real(RK) function getTemp( this, i, j ) ! GETter for temperature
147     class(Solver), intent(in) :: this
148     integer(IK), intent(in) :: i, j
149     getTemp = 0.5*( this%mU(i,j) + this%mV(i,j) )
150	end function getTemp

	
	 subroutine run( this ) ! method for time-marching
153     class(Solver), intent(inout) :: this
154     integer(IK) :: k ! dummy index (time-marching)

156     do k=1, this%mNumItersMax ! MAIN loop
       ! simple progress-monitor
158        if( mod(k-1, (this%mNumItersMax-1)/10) == 0 ) then
159           write(*, '(i5,a)') nint((k*100.0)/this%mNumItersMax), "%"
160        end if
        ! defer work to private methods
162        call this%advanceU()
163        call this%advanceV()
164        this%mCurrIter = this%mCurrIter + 1 ! tracking time step
165     end do
166   end subroutine run

168   subroutine advanceU( this )
169     class(Solver), intent(inout) :: this
170     integer(IK) :: i, j ! local variables
 ! actual update for 'mU'-field (NE-ward)
172     do j=1, this%mConfig%mNx-1   ! do NOT update
173        do i=1, this%mConfig%mNx-1 ! boundaries
174           this%mU(i,j) = this%mA*this%mU(i,j) + this%mB*( &
                this%mU(i-1,j) + this%mU(i+1,j) + this%mU(i,j-1) + this%mU(i,j+1) )
176        end do
177     end do
178   end subroutine advanceU

180   subroutine advanceV( this ) ! similar to 'advanceU'
181     class(Solver), intent(inout) :: this
    ! .....................................................
183     integer(IK) :: i, j ! local variables
    ! actual update for 'mV'-field (SW-ward)
185     do j=this%mConfig%mNx-1, 1, -1   ! do NOT update
186        do i=this%mConfig%mNx-1, 1, -1 ! boundaries
187           this%mV(i,j) = this%mA*this%mV(i,j) + this%mB*( &
               this%mV(i-1,j) + this%mV(i+1,j) + this%mV(i,j-1) + this%mV(i,j+1) )
189        end do
190     end do
191	end subroutine advanceV

	 ! method for producing a ASCII output file
194   subroutine writeAscii( this, outFilePath )
195     class(Solver), intent(in) :: this
196     character(len=*), intent(in) :: outFilePath
    ! .....................................................
198     integer(IK) :: x, y, outFileID ! local variables

200     open( newunit=outFileID, file=trim(outFilePath), status='replace', action='write' )
201     write(outFileID, '(a)') &
          "# output file for program solve_heat_diffusion_v1.f90"
203     write(outFileID, '(a,2x,a)') '"s"', "# time unit"
204     write(outFileID, '(f0.8,2x,a)') &
         (this%mCurrIter*this%mConfig%mSideLength**2)/ &
          (this%mConfig%mDiffusivity*this%mNt), &
          "# current time"
208     write(outFileID, '(a,2x,a)') '"m"', "# X unit"
209     write(outFileID, '(i0,2x,a)') this%mConfig%mNx, "# Nx"
210     write(outFileID, '(a,2x,a)') '"m"', "# Y unit"
211     write(outFileID, '(i0,2x,a)') this%mConfig%mNx, "# Ny"
212     write(outFileID, '(a,2x,a)') '"degree~C"', "# temperature unit"
     ! X-axis
214     do x=0, this%mConfig%mNx
215        write(outFileID, '(f0.8,2x)', advance='no') this%mDx*this%mConfig%mSideLength*x
216     end do
217     write(outFileID, '(a)') "# XVals"
    ! Y-axis
219     do y=0, this%mConfig%mNx
220        write(outFileID, '(f0.8,2x)', advance='no') this%mDx*this%mConfig%mSideLength*y
221     end do
222     write(outFileID, '(a)') "# YVals"
    ! simulation results
224     write(outFileID, '(a)') "# from next line to end: simulated temperature"
225     do y=0, this%mConfig%mNx
226        do x=0, this%mConfig%mNx
227           write(outFileID, '(f0.8,2x)', advance='no') &
               this%mConfig%mTempD+this%getTemp(x,y)*(this%mConfig%mTempA-this%mConfig%mTempD)
229        end do
230        write(outFileID, *) ! newline to separate rows for R visualization script
231     end do
232     close(outFileID)
233   end subroutine writeAscii

  ! destructor method
236   subroutine cleanup( this )
     ! 'class' -> 'type' (dummy-arg cannot be polymorphic for final procedures)
238     type(Solver), intent(inout) :: this
    ! in this version, we only deallocate memory
240     deallocate( this%mU, this%mV )
241   end subroutine cleanup
242	end module Solver_class

	
	 program solve_heat_diffusion_v1
   use NumericKinds
   use Solver_class
247   implicit none

 type(Solver) :: square
   real(RK) :: simTime = 0.1 ! no. of characteristic time-intervals to simulate

252   character(len=200) :: configFile = "config_file_formatted.in", &
        outputFile = "simulation_final_temp_field.dat"

255   call square%init( configFile, simTime ) ! call Initializer
256   call square%run()

258	  call square%writeAscii( outputFile )
	  
	  pause
259 end program solve_heat_diffusion_v1

 

 

728x90
반응형
728x90
반응형

10대 자녀가 반항을 하면
그건 아이가 거리에서 방황하지 않고 집에 잘 있다는 것이고...

지불해야할 세금이 있다면 그건 나에게 직장이 있다는 것이고...

파티를 하고나서 치워야 할게 너무 많다면
그건 친구들과 즐거운 시간을 보냈다는 것이고...

옷이 몸에 좀 낀다면
그건 잘먹고 잘살고 있다는 것이고...

깍아야할 잔디, 닦아야할 유리창, 고쳐야 할 하수구가 있다면 그건 나에게 집이 있다는 것이고..

정부에 대한 불평불만의 소리가 많이 들리면
그건 언론의 자유가 있다는 것이고...

주차장 맨끝 먼곳에 겨우 자리가 하나 있다면
그건 내가 걸을 수 있는데다 차두 있다는 것이고...

난방비가 너무 많이 나왔다면
그건 내가 따뜻하게 살고 있다는 것이고...

교회에서 뒷자리 아줌마의 엉터리 성가가 영 거슬린다면...
그건 내가 들을 수 있다는 것이고...

세탁하고 다림질해야 할 일이 산더미라면
그건 나에게 입을 옷이 많다는 것이고...

온몸이 뻐근하고 피로하다면
그건 내가 열심히 일했다는 것이고...

이른 새벽 시끄런운 자명종 소리에 깼다면
그건 내가 살아있다는 것이고..

그리고...,


마음속에 나도 모르게 일궈진 불평, 불만들
바꾸어 생각해 보면 또 감사한 일이라는 것을...

728x90
반응형
728x90
반응형

엄마는
그래도 되는 줄 알았습니다.

하루종일 밭에서 죽어라 힘들게 일해도
엄마는 그래도 되는 줄 알았습니다.

찬밥 한 덩이로 대충 부뚜막에 앉아 점심을 때워도
엄마는 그래도 되는 줄 알았습니다.

한겨울 냇물에 맨손으로 빨래를 방망이질해도
엄마는 그래도 되는 줄 알았습니다.

배부르다, 생각 없다, 식구들 다 먹이고 굶어도
엄마는 그래도 되는 줄 알았습니다.

발뒤꿈치 다 헤져 이불이 소리를 내도
엄마는 그래도 되는 줄 알았습니다.

손톱이 깎을 수조차 없이 닳고 문드러져도
엄마는 그래도 되는 줄 알았습니다.

아버지가 화내고 자식들이 속썩여도 끄떡없는
엄마는 그래도 되는 줄 알았습니다.

외할머니 보고싶다, 그것이 그냥 넋두리인 줄만알았던...

한밤중 자다 깨어 방구석에서 한없이 소리 죽여 울던
엄마를 본 후론

아! 엄마는 그러면 안 되는 것이었습니다.

어머니 ! 사랑합니다!....

728x90
반응형
728x90
반응형

아버지란 기분이 좋을 때 헛기침을 하고,
겁이 날 때 너털웃음을 웃는 사람이다.

아버지란 자기가 기대한 만큼 아들, 딸의
학교 성적이 좋지 않을 때 겉으로는,
'괜찮아, 괜찮아' 하지만
속으로는 몹시 화가 나는 사람이다.

아버지의 마음은 먹칠을 한 유리로 되어 있다.
그래서 잘 깨지기도 하지만,
속은 잘 보이지 않는다.
아버지란 울 장소가 없기에 슬픈 사람이다.

아버지가 아침 식탁에서 성급하게 일어나서 나가는
장소(그 곳을 직장이라고 한다)는,
즐거운 일만 기다리고 있는 곳은 아니다.
아버지는 머리가 셋 달린 龍과 싸우러 나간다.
그것은 피로와, 끝없는 일과, 직장 상사에게서 받는 스트레스다.

아버지란 '내가 아버지 노릇을 제대로 하고 있나?
내가 정말 아버지다운가?'하는 자책을 날마다 하는 사람이다.

아버지란 자식을 결혼시킬 때 한없이 울면서도
얼굴에는 웃음을 나타내는 사람이다.

아들, 딸이 밤늦게 돌아올 때에 어머니는 열 번
걱정하는 말을 하지만, 아버지는 열 번 현관을 쳐다본다.

아버지의 최고의 자랑은 자식들이 남의 칭찬을 받을 때이다.

아버지가 가장 꺼림칙하게 생각하는 속담이 있다.
그것은 "가장 좋은 교훈은 손수 모범을 보이는
것이다"라는 속담이다.

아버지는 늘 자식들에게 그럴 듯한 교훈을 하면서도,
실제 자신이 모범을 보이지 못하기 때문에,
이 점에 있어서는 미안하게 생각도 하고 남모르는 콤플렉스도 가지고 있다.

아버지는 이중적인 태도를 곧잘 취한다.
그 이유는 '아들, 딸들이 나를 닮아 주었으면'하고 생각하면서도,
'나를 닮지 않아 주었으면'하는 생각을 동시에 하기 때문이다.

아버지에 대한 인상은 나이에 따라 달라진다.
그러나 그대가 지금 몇 살이든지, 아버지에 대한
현재의 생각이 최종적이라고 생각하지 말라.

일반적으로 나이에 따라 변하는 아버지의 인상은,
4세때--아빠는 무엇이나 할 수 있다.
7세때--아빠는 아는 것이 정말 많다.
8세때--아빠와 선생님 중 누가 더 높을까?
12세때-아빠는 모르는 것이 많아.
14세때-우리 아버지요? 세대 차이가 나요.
25! 세때-아버지를 이해하지만, 기성세대

아버지란 돌아가신 뒤에도,
두고두고 그 말씀이 생각나는 사람이다.

아버지란 돌아가신 後에야 보고 싶은 사람이다.

아버지는 결코 무관심한 사람이 아니다.
아버지가 무관심한 것처럼 보이는 것은, 체면과
자존심과 미안함 같은 것이 어우러져서 그 마음을
쉽게 나타내지 못하기 때문이다.

아버지의 웃음은 어머니의 웃음의 2배쯤 농도가 진하다.
울음은 열 배쯤 될 것이다.

아들, 딸들은 아버지의 수입이 적은 것이나,
아버지의 지위가 높지 못한 것에 대해 불만이
있지만, 아버지는 그런 마음에 속으로만 운다.

아버지는 가정에서 어른인 체를 해야 하지만,
친한 친구나 맘이 통하는 사람을 만나면 소년이 된다.

아버지는 어머니 앞에서는 기도도 안 하지만,
혼자 車를 운전하면서는 큰소리로 기도도 하고
주문을 외기도 하는 사람이다.

어머니의 가슴은 봄과 여름을 왔다갔다하지만,
아버지의 가슴은 가을과 겨울을 오고간다.

아버지! 뒷동산의 바위 같은 이름이다.

시골마을의 느티나무 같은 크나 큰 이름이다..

728x90
반응형
728x90
반응형

1. 정확도

실제와 에측이 얼마나 일치하는가로 모델의 성능을 평가함

연속형 자료의 경우

예측값의 일치도를 의미.

정확도가 평가의 대부분임

범주형 자료의 경우

예측 범주의 일치정도를 의미.

정확도 뿐 아니라 그 이면을 세세하게 검토해야 함. 

 

2. 오차행렬(confusion matrix)

오차 행렬은 이진 또는 다중 범주형 레이블의 하위 범주는 세부적으로 살펴보면서 실제 범주와 예측 범주의 일치 혹은 오류를 파악할 수 있는 결과임

 

 

 

  0 1
0 90 10
1 20 80

 

  음성예측 양성예측
음성 클래스 TN FP
양성 클래스 FN TP

 

 

정확도 = (90+80)/200 = 85%

 

이진 분류의 평가 지표

3. 정밀도

양성 예측의 정확도를 의미

 

4. 재현율

분류기가 정확하게 예측한 양성 샘플의 비율

민감도 또는 진짜 양성 비율이라고도 함. 

암진단/범죄여부/불법영상 진단 등

 

5. f-score

정밀도와 재현율의 조화평균으로 두 지표를 종합적으로 파악

 

정밀도 = TP/(TP + FP)

재현율 = TP/(TP+FN)

f-score = 2/((1/정밀도) + (1/재현율))

728x90
반응형
728x90
반응형

의사 결정 나무 

다양한 의사결정 결로와 결과를 놓고 나무 구조를 이용하여 설명하는 것

질문을 던지면서 대상에 접근해 가는 스무고개 놀이와 유사

질문은 조건을 이분법적으로 제시하면서 진행한다. 

지도학습 기법으로서 변수의 영역을 게속적으로 분할해 나가면서 집단을 몇개의 소집단으로 분류하거나 예측하는 기법

 

맨 위쪽에 뿌리 노드로 시작해서 아래로 가면서 가지를 치고 마지막까지 진행한다. 

처음에 어떤 분류기준을 선택할 것인가를 결정하는 것은 여러 알고리즘이 있다. 

예를 들어, 프로 야구선수중에서 자유게약 선수(Free Agaent: FA)의 연봉을 의사결정 나무로 간단히 그려보자. 

의사결저과정에서 나무를 가지고 목표와상황과 상호 관련성을 나타내어 최종 결정을 내린다. 의사결정 규칙을 나물 구조로 도식화 하여 관심대상의 집단을 몇 개의 소집단으로 분류하거나 예측할 수 있다. 

if-else 원리로 코딩할 수 있다. 

 

일반적으로 기업에서 의사결정을 내릴때, 어떠한 위험(손실)과 기회(이익)가 있는지 판단하여 최적의 의사결정을 도와주는 프로그램으로 많이 활용한다. 

1단계

나무 모형 구축: 분석 목적과 자료구조에 따라 적절한 분리기준과 정지규칙을 정하여 나무를 만들어 나간다. 

2단계

가지치기 : 분류 오류를 크게 할 위험이 높거나 부적절한 추론규칙이 내재된 가지는 제거한다. 

3단계

분리작업: 더 이상 유효하지 않거나 최소 노드수에 도달할 때까지 분리를 계속한다. 

4단계

타당성 평가: 이익 또는 위험 도표나 검정자료를 이용하여 나무 모형의 교차 타당성을 평가한다. 

5단계

해석과 예측: 결과를 해석하고 예측을 수행한다. 

 

시각적인 효과는 행동의 결정 뿐만 아니라 미래의 계획을 세우는 데도 유용하게 사용될 수 있다. 

그래서 의사결정나무를 적합성나무(relevance tree)라고도 부른다. 

 

 

 

 

728x90
반응형
728x90
반응형

https://machinelearningmastery.com/avoid-overfitting-by-early-stopping-with-xgboost-in-python/

 

Avoid Overfitting By Early Stopping With XGBoost In Python

Overfitting is a problem with sophisticated non-linear learning algorithms like gradient boosting. In this post you will discover how you can use early stopping to limit overfitting with XGBoost in Python. After reading this post, you will know: About earl

machinelearningmastery.com

 

728x90
반응형

+ Recent posts