Logistic Regression은 로지스틱 함수를 사용하여 이진 분류(binary classification)를 수행하는 알고리즘입니다. 이 알고리즘은 입력 변수의 가중치 합을 로지스틱 함수에 넣어서 결과를 0과 1사이의 값으로 변환합니다. 이를 이진 분류에서 확률값으로 해석하여 예측하는 방식입니다.
이때 입력 변수의 가중치 합을 로지스틱 함수에 넣어서 확률값으로 변환하는데, 이 가중치는 입력 변수의 영향력을 나타내는 값입니다.
가중치 값은 일반적으로 최적화 알고리즘을 사용하여 계산됩니다. 최적화 알고리즘은 학습 데이터를 사용하여 모델의 예측값과 실제값의 차이를 최소화하는 가중치 값을 찾습니다. 이때 찾은 가중치 값은 모델의 학습 결과를 나타내는 것입니다.
예를 들어, 성별을 예측하는 문제를 생각해보겠습니다. 이 때, 입력 변수로는 나이, 키, 체중 등 여러 요인을 사용할 수 있습니다. 이러한 입력 변수들은 각각 가중치가 부여되어 로지스틱 함수에 적용됩니다. 로지스틱 함수의 출력값은 0과 1사이의 값으로 변환되며, 이를 성별에 대한 확률값으로 해석할 수 있습니다. 예를 들어, 로지스틱 함수의 출력값이 0.7이면, 해당 개체가 여성일 확률이 70%라는 것을 의미합니다. 따라서, 이 알고리즘은 이진 분류에서 예측 결과를 확률값으로 출력하므로, 분류 문제에서 매우 효과적으로 사용됩니다.
좀 더 쉬운 예를 들어보면, 로지스틱 회귀는 예를 들어 누군가의 공부 시간에 따라서 시험 합격 여부를 예측하는 경우를 생각해볼 수 있습니다. 이 때 공부 시간이 입력 변수이고, 합격 여부가 출력 변수입니다. 로지스틱 회귀 모델은 입력 변수(공부 시간)의 가중치 합을 로지스틱 함수에 넣어서 결과를 0~1 사이의 값으로 출력하고, 이를 이진 분류에서 확률값으로 해석하여 예측합니다. 즉, 공부 시간이 많을수록 시험에 합격할 확률이 높아진다고 예측할 수 있습니다.
null 값은 데이터에서 값이 존재하지 않는 상태를 나타냅니다. 이는 데이터가 제대로 수집되지 않았거나, 처리 과정에서 누락되었을 수 있습니다. null 값이 있는 데이터를 그대로 사용하게 되면 해당 데이터를 이용한 분석 결과가 왜곡되거나 신뢰성이 떨어지는 문제가 발생할 수 있습니다.
따라서, 데이터를 분석하거나 모델을 학습할 때, null 값이 존재하는 데이터는 분석의 대상이 되면 안되며, 해당 데이터를 삭제하거나 다른 값으로 대체해야 합니다.
예를 들어, 다음과 같은 상황에서 null 값이 발생할 수 있습니다.
설문조사에서 일부 응답자가 특정 항목에 대해 답변하지 않은 경우
온라인 쇼핑몰에서 고객이 결제 정보를 입력하지 않은 경우
주식 거래 데이터에서 특정 일자에 거래가 이루어지지 않은 종목이 있는 경우
이러한 결측치가 있는 데이터를 그대로 사용하면 분석 결과에 오류가 생기거나 모델의 성능이 저하될 수 있습니다.
따라서 null 값은 처리해 주어야 합니다. 일반적으로는 다음과 같은 방법들이 사용됩니다.
삭제: 결측치가 포함된 데이터를 삭제하는 방법입니다. 이 방법은 결측치가 일부인 경우에는 유용할 수 있지만, 결측치가 많은 경우에는 분석 결과에 영향을 미칠 수 있으므로 주의해야 합니다.
대체: 결측치를 다른 값으로 대체하는 방법입니다. 예를 들어, 평균값, 중앙값, 최빈값 등을 사용할 수 있습니다. 이 방법은 결측치가 적은 경우에 유용합니다.
예측: 결측치를 다른 변수를 이용하여 예측하는 방법입니다. 이 방법은 결측치가 많은 경우에 유용합니다.
null 값은 예를 들어서, 고객 정보 데이터셋에서 나이(age)가 null인 경우, 해당 고객의 나이 정보가 없는 것을 의미합니다. 이 경우에는 대체 방법을 사용하여 결측치를 대체하거나, 예측 방법을 사용하여 해당 고객의 나이를 예측할 수 있습니다.
정규식(regular expression)은 특정한 패턴의 문자열을 표현하기 위한 문법입니다. 머신러닝에서도 텍스트 데이터를 다룰 때 정규식을 활용하여 데이터를 처리합니다. 텍스트 데이터를 처리할 때, 일관적인 패턴의 문자열을 추출해내는 등의 작업을 수행하기 위해 정규식을 사용합니다. 예를 들어, 이메일 주소를 추출할 때, 이메일의 패턴에 맞는 정규식을 사용하여 이메일 주소를 추출할 수 있습니다.
정규식 패턴을 만들 때는 다양한 메타문자(meta-character)를 사용합니다. 메타문자는 특정한 의미를 가지며, 이를 조합하여 패턴을 만들어냅니다. 예를 들어, ‘\d’는 숫자를 의미하며, ‘\w’는 알파벳 대소문자와 숫자를 의미합니다. 이 외에도 ‘^’는 문자열의 시작을 의미하며, ‘$’는 문자열의 끝을 의미합니다.
머신러닝에서는 CountVectorizer, TfidfVectorizer 등의 벡터화 기법에서도 정규식을 사용합니다. CountVectorizer의 경우, token_pattern 인자에 정규식을 지정하여, 문자열을 추출할 때 사용합니다. 예를 들어, token_pattern=r’\b\w+\b’는 알파벳 또는 숫자가 1개 이상인 문자열만 추출하여 단어로 사용합니다. 이렇게 추출한 단어들을 벡터화하여 머신러닝 모델의 입력으로 사용합니다.
r’\b\w+\b’는 정규식 패턴으로서, 단어를 추출할 때 고려되는 문자열의 패턴을 지정합니다. 이 패턴은 다음과 같이 구성됩니다.
\b : 단어 경계를 의미합니다. 즉, 단어의 시작과 끝을 나타냅니다.
\w+ : 알파벳 또는 숫자가 1개 이상인 문자열을 나타냅니다. 이 문자열은 단어로서 추출됩니다.
r 은 “raw string”의 약자로서, 문자열을 해석할 때 escape 문자(예: \n, \t 등)를 무시하고 그대로 해석하도록 지정하는 파이썬의 문자열 리터럴 접두어입니다. 이를 사용하면 문자열 안에서 역슬래시를 사용할 때 일반적인 문자열 리터럴보다 편리하게 사용할 수 있습니다.예를 들어, 일반적인 문자열 리터럴에서는 역슬래시를 사용하려면 두 번 써야 합니다. 예를 들어, “\n”은 줄바꿈 문자를 나타냅니다. 그러나 r 접두어를 사용하면 “\n” 대신에 r”\n”으로 사용할 수 있습니다. 이렇게 하면 역슬래시를 두 번 쓰는 것보다 코드를 더욱 간결하게 작성할 수 있습니다.
따라서 r’\b\w+\b’는 “raw string”으로서, 백슬래시 문자를 특수문자로 해석하지 않고 문자열 그대로 해석하도록 하는 것을 의미합니다.
따라서 r’\b\w+\b’ 패턴을 적용하면, 알파벳 또는 숫자가 1개 이상인 문자열을 단어로서 추출할 수 있습니다.
예를 들어, 다음과 같은 문자열이 있다고 가정해보겠습니다.
string = "The quick brown fox jumps over the lazy dog. 12345"
이 문자열에서 CountVectorizer(token_pattern=r’\b\w+\b’)를 사용하면, 다음과 같은 단어들이 추출됩니다.
나머지 부분은 기본적으로 동일하게 사용하고 app.py가있는 동일한 폴더에서 img_classification.py라는 파일을 만들고 다음과 같이 해 줍니다.
import keras
from PIL import Image, ImageOps
import numpy as np
def mri_machine_classification(img, weights_file):
# 모델로드
model = keras.models.load_model(weights_file)
# keras 모델에 공급할 올바른 모양의 배열을 만듭니다.
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
image = img
#이미지 크기 조정
#resize the image to a 224x224 with the same strategy as in TM2:
#resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
#이미지를 numpy 배열로 바꿈.
image_array = np.asarray(image)
# 이미지 정규화
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
# 이미지를 배열에로드
data[0] = normalized_image_array
# 예측 시작
prediction = model.predict(data)
return np.argmax(prediction) # 가장 높은 확률의 반환 위치
그리고 app.py 에서는 이미지를 업로드 하고, .h5 모델을 불러와 주는 부분을 추가합니다.
st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
#https://stackoverflow.com/questions/50906123/nameerror-name-image-is-not-defined/50906222
from PIL import Image, ImageOps
from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded MRI.', use_column_width=True)
st.write("")
st.write("처리중입니다...")
label = mri_machine_classification(image, 'keras_model.h5')
if label == 0:
st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
else:
st.write("***결과 : MRI 스캔은 건강합니다***")
app.py의 전체 소스코드는 다음과 같습니다.
import streamlit as st
from PIL import Image
st.set_option('deprecation.showfileUploaderEncoding', False) # deprecation 표시 안함
st.title("머신러닝 이용 뇌종양 MRI 사진 판독 서비스")
st.markdown("""
뇌종양 MRI 사진을 분류합니다.
이 서비스는 의사들의 뇌 MRI 사진 판독의 도우미일 뿐입니다.
정확한 최종 진단 결과는 반드시 전문 담당 의사의 확인과 승인을 거치십시요.""")
image2 = Image.open('brain.jpg')
st.image(image2, caption='shop2world.com 뇌종양 MRI 판독 서비스',use_column_width=True)
st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
from PIL import Image, ImageOps
from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded MRI.', use_column_width=True)
st.write("")
st.write("처리중입니다...")
label = mri_machine_classification(image, 'keras_model.h5')
if label == 0:
st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
else:
st.write("***결과 : MRI 스캔은 건강합니다***")
그리고 이제 heroku 서버에 업로드 해서 적용 합니다.
다음의 세가지 파일을 만듭니다.
setup.sh
mkdir -p ~/.streamlit/
echo “\
[server]\n\
headless = true\n\
enableCORS=false\n\
port = $PORT\n\
” > ~/.streamlit/config.toml
Procfile
web: sh setup.sh && streamlit run app.py
requirements.txt
numpy
streamlit
pillow
keras
tensorflow
이제 모든 파일이 준비되어 하드디스크에서 업로드 할때 먼저 깃 리파지토리 초기화를 합니다.
git init
그리고 다음의 절차를 거쳐서 업로드 합니다.
heroku login
heroku create
git add .
git commit -m “Some message”
git push heroku master
만약 업데이트만 해줄 때는 다음과 같이 합니다. (// 뒤는 주석 설명이므로 타이핑 할 필요 없습니다.)
git add . // 변경사항 add
git commit -m “sopt 최고” // 스테이징
git push heroku master // 업데이트
최종 결과
https://shop2titanic.herokuapp.com/
전체 소스 코드
https://ai.shop2world.net/data/mri_brain.zip결론
머신러닝을 의료 서비스 분야에 적용하거나 우리 삶에 필요한 도움이 되도록 할때
일반인이 쉽게 적근할 수 있는 웹 앱 서비스로 구현하는 것은 필수 입니다.
관련 해당 서비스를 만들어 보았습니다.
머신러닝 프로젝트 개발 문의
– 세계최고의 머신러닝 두뇌가 포진한 몬트리올에서
여러분 상상을 초월한 미래형 프로젝트 진행이 가능합니다.
문의 이메일
info@shop2world.com
프로젝트 구현 사이트 보기 : 머신러닝 이용 뇌종양 MRI 사진 판독 서비스
여기서는 Streamlit 을 사용한 웹 앱으로 서비스를 만들어 봅니다.
이미지 분류는 이미지 파일의 내용을 기반으로 미리 정의 된 특정 클래스에 이미지를 할당 할 수있는 컴퓨터 시각인식 모델 알고리즘 입니다.
이를 통해 우리가 서비스할 프로그램이 이미지 데이터에 대한 분류 및 정렬 작업을 수행 할 수 있도록하는 데 사용됩니다.
여기서 사용할 분류기는 Google Teachable Machine을 이용해 사전 훈련된 모델을 이용할 것이며 Python을 사용합니다.
이 강좌는 다음의 사전 지식을 기반으로 진행합니다.
app.py라는 파일을 만듭니다. 웹 페이지에 콘텐츠를 표시하는 Streamlit 코드를 포함하는 파일입니다.
import streamlit as st
from PIL import Image
st.set_option('deprecation.showfileUploaderEncoding', False) # deprecation 표시 안함
st.title("머신러닝 이용 뇌종양 MRI 사진 판독 서비스")
st.markdown("""
뇌종양 MRI 사진을 분류합니다.
이 서비스는 의사들의 뇌 MRI 사진 판독의 도우미일 뿐입니다.
정확한 최종 진단 결과는 반드시 전문 담당 의사의 확인과 승인을 거치십시요.""")
image2 = Image.open('brain.jpg')
st.image(image2, caption='shop2world.com 뇌종양 MRI 판독 서비스',use_column_width=True)
2.이미지 분류 모델 만들기
https://teachablemachine.withgoogle.com/train
구글 Teachable Machine을 사용해 여러분은 이미지뿐 아니라 , 오디오 또는 포즈 프로젝트를 만들 수 있습니다. 이 경우 이미지 분류 프로젝트로서 Image Project를 선택합니다.
데이터셋
훈련을 위해서는 데이터가 필요합니다. 여기서는 Kaggle의 뇌종양 검출 데이터 셋을 다운로드 받아 압축을 푸세요.
https://www.kaggle.com/navoneel/brain-mri-images-for-brain-tumor-detection
(캐글에서 다운로드 안될 경우 여기서도 다운로드 가능합니다.)
이미지 분류 페이지에서 종양이 있는 뇌와 없는 뇌를 구분하는 클래스를 만들어 라벨링 작업을 하고, 해당 클래스에 이미지를 업로드하고 학습을 시킵니다.
그리고 완료되면 훈련된 파일(확장자가 .h5 인 가중치 파일)을 다운로드 해, 이것을 이용해 서비스를 제공합니다.
동영상의 설명을 보면서 함께 해 봅니다.
3그리고 Export에 보면 다음과 같이 적용 예 소스가 있습니다.
우리는 이것을 기반으로 streamlit에서 아래 소스의 model 부분과 image 부분을 분리해 처리하도록 만들겠습니다.
model = tensorflow.keras.models.load_model('keras_model.h5')image = Image.open('test_photo.jpg')
import tensorflow.keras
from PIL import Image, ImageOps
import numpy as np
# Disable scientific notation for clarity
np.set_printoptions(suppress=True)
# Load the model
model = tensorflow.keras.models.load_model('keras_model.h5')
# Create the array of the right shape to feed into the keras model
# The 'length' or number of images you can put into the array is
# determined by the first position in the shape tuple, in this case 1.
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
# Replace this with the path to your image
image = Image.open('test_photo.jpg')
#resize the image to a 224x224 with the same strategy as in TM2:
#resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
#turn the image into a numpy array
image_array = np.asarray(image)
# display the resized image
image.show()
# Normalize the image
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
# Load the image into the array
data[0] = normalized_image_array
# run the inference
prediction = model.predict(data)
print(prediction)
나머지 부분은 기본적으로 동일하게 사용하고 app.py가있는 동일한 폴더에서 img_classification.py라는 파일을 만들고 다음과 같이 해 줍니다.
import keras
from PIL import Image, ImageOps
import numpy as np
def mri_machine_classification(img, weights_file):
# 모델로드
model = keras.models.load_model(weights_file)
# keras 모델에 공급할 올바른 모양의 배열을 만듭니다.
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
image = img
#이미지 크기 조정
#resize the image to a 224x224 with the same strategy as in TM2:
#resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
#이미지를 numpy 배열로 바꿈.
image_array = np.asarray(image)
# 이미지 정규화
normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
# 이미지를 배열에로드
data[0] = normalized_image_array
# 예측 시작
prediction = model.predict(data)
return np.argmax(prediction) # 가장 높은 확률의 반환 위치
그리고 app.py 에서는 이미지를 업로드 하고, .h5 모델을 불러와 주는 부분을 추가합니다.
st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
#https://stackoverflow.com/questions/50906123/nameerror-name-image-is-not-defined/50906222
from PIL import Image, ImageOps
from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded MRI.', use_column_width=True)
st.write("")
st.write("처리중입니다...")
label = mri_machine_classification(image, 'keras_model.h5')
if label == 0:
st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
else:
st.write("***결과 : MRI 스캔은 건강합니다***")
app.py의 전체 소스코드는 다음과 같습니다.
import streamlit as st
from PIL import Image
st.set_option('deprecation.showfileUploaderEncoding', False) # deprecation 표시 안함
st.title("머신러닝 이용 뇌종양 MRI 사진 판독 서비스")
st.markdown("""
뇌종양 MRI 사진을 분류합니다.
이 서비스는 의사들의 뇌 MRI 사진 판독의 도우미일 뿐입니다.
정확한 최종 진단 결과는 반드시 전문 담당 의사의 확인과 승인을 거치십시요.""")
image2 = Image.open('brain.jpg')
st.image(image2, caption='shop2world.com 뇌종양 MRI 판독 서비스',use_column_width=True)
st.text("***이미지 분류를 위해 뇌 MRI 이미지를 업로드 해 주세요***")
#Streamlit 파일 처리 및 결과
from PIL import Image, ImageOps
from img_classification import mri_machine_classification
uploaded_file = st.file_uploader("뇌 MRI 사진을 업로드 해 주세요.", type=['jpeg', 'png', 'jpg', 'webp'])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption='Uploaded MRI.', use_column_width=True)
st.write("")
st.write("처리중입니다...")
label = mri_machine_classification(image, 'keras_model.h5')
if label == 0:
st.write("***결과 : MRI 스캔에는 뇌종양이 있습니다***")
else:
st.write("***결과 : MRI 스캔은 건강합니다***")
그리고 이제 heroku 서버에 업로드 해서 적용 합니다.
다음의 세가지 파일을 만듭니다.
setup.sh
mkdir -p ~/.streamlit/
echo “\
[server]\n\
headless = true\n\
enableCORS=false\n\
port = $PORT\n\
” > ~/.streamlit/config.toml
Procfile
web: sh setup.sh && streamlit run app.py
requirements.txt
numpy
streamlit
pillow
keras
tensorflow
이제 모든 파일이 준비되어 하드디스크에서 업로드 할때 먼저 깃 리파지토리 초기화를 합니다.
git init
그리고 다음의 절차를 거쳐서 업로드 합니다.
heroku login
heroku create
git add .
git commit -m “Some message”
git push heroku master
만약 업데이트만 해줄 때는 다음과 같이 합니다. (// 뒤는 주석 설명이므로 타이핑 할 필요 없습니다.)
git add . // 변경사항 add
git commit -m “sopt 최고” // 스테이징
git push heroku master // 업데이트
최종 결과
https://shop2titanic.herokuapp.com/
전체 소스 코드
https://ai.shop2world.net/data/mri_brain.zip결론
머신러닝을 의료 서비스 분야에 적용하거나 우리 삶에 필요한 도움이 되도록 할때
일반인이 쉽게 적근할 수 있는 웹 앱 서비스로 구현하는 것은 필수 입니다.
관련 해당 서비스를 만들어 보았습니다.
머신러닝 프로젝트 개발 문의
– 세계최고의 머신러닝 두뇌가 포진한 몬트리올에서
여러분 상상을 초월한 미래형 프로젝트 진행이 가능합니다.
문의 이메일
info@shop2world.com
얼굴 인식 분야에서 머신러닝 기술이 널리 사용되고 있습니다. 딥러닝 모델을 사용하여 얼굴 이미지에서 특징을 추출하고, 추출된 특징을 분류 알고리즘에 적용하여 얼굴이 어떤 사람의 것인지 구별할 수 있습니다. 예를 들어, 얼굴 인식 기술을 사용하여 보안 인증 시스템이나 사진 검색 서비스 등에 적용할 수 있습니다.
해결 과제.
머신러닝은 주어진 데이터에서 패턴을 찾아내는 기술입니다. 하지만 인간의 관상은 개인의 생년월일, 이름 등 개인정보와도 관련이 있는 것으로 알려져 있습니다. 따라서, 머신러닝으로 관상을 본다는 것은 개인정보의 사용과 관련된 문제가 발생할 수 있습니다. 또한, 머신러닝 모델은 훈련 데이터에 기반하여 학습되기 때문에, 데이터셋의 편향성이나 노이즈 등에 따라 결과가 왜곡될 수 있습니다.
또 과거에 살았던 사람들의 얼굴데이터를 이용해 분류 패턴을 학습시키는 것은 가능합니다. 이를 위해서는 적절한 양의 얼굴데이터가 필요하며, 데이터 수와 질이 결과에 큰 영향을 미칩니다. 따라서 데이터의 수집과 전처리, 그리고 분류 알고리즘의 선택과 학습 과정 등이 중요한 역할을 합니다.