본문 바로가기

Github & Streamlit

Streamlit 에서 인공지능 : 차 구매 가능 가격 예측

반응형

웹 대시보드로 만드는 이유는 유저와의 상호소통을 위해서. 

 

Streamlit 에서 예측 인공지능 실행 

- colab/ Jupyter Notebook

- 전에 만들어놨던 car_purchasing_data파일에서 인공지능 학습을 완료한 스케일러와 리그레서를 저장하여 가져온다. 

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from google.colab import drive
drive.mount('/content/drive')

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
# change directory

car_df = pd.read_csv('Car_Purchasing_Data.csv',encoding = 'ISO-8859-1')

 

 

X,y설정

X = car_df.loc[:, 'Gender': 'Net Worth']
y = car_df['Car Purchase Amount']

 

X 스케일러 적용

from sklearn.preprocessing import MinMaxScaler

scaler_X = MinMaxScaler()
X= scaler_X.fit_transform(X)

 

y 스케일러 적용

# 스케일러는 무조건 2차원으로 들어가야한다. 현재 y는 1차원

# 시리즈는 reshape이 없다.

y = y.values.reshape(500,1)
scaler_y = MinMaxScaler()
y = scaler_y.fit_transform(y)

 

리니어 리그레션으로 모델링 및 학습

from sklearn.model_selection import train_test_split

X_train,X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, random_state= 50)

 

from sklearn.linear_model import LinearRegression

regressor = LinearRegression()

regressor.fit(X_train, y_train)

 

y_pred = regressor.predict(X_test)
error = y_test - y_pred
(error**2).mean()

 

 인공지능과, X용 스케일러, y용 스케일러를 파일로 저장한다. 

import joblib 

joblib.dump(regressor,'regressor.pkl')

 

# 파일명은 변수명과 똑같이 저장

# 확장자명 피클 pkl

 

joblib.dump(scaler_X, 'scaler_X.pkl')

joblib.dump(scaler_y, 'scaler_y.pkl')



- 유저에게 고객 이름 컬럼을 검색할수 있는 기능

# 1. 유저한테 검색어를 입력받는다. 

# 2. 검색어를 고객이름 컬럼에 들어있는 데이터 가져온다.

# 3. 화면에 보여준다. 

 

car_df.loc[car_df['Customer Name'].str.lower().str.contains('he'), ]

 

- Git 허브에서 새로운 레파지토리 생성 후에, vscode에 진입

ㄴ 각 app.py, app_home.py, app_eda.py, app_ml.py 파일을 생성해준다. 

ㄴ app.py가 메인 파일. 다른 각 파일에서는 함수 생성할 것.

 

(이하 app.py)

 

import streamlit as st

from app_eda import run_eda
from app_home import run_home
from app_ml import run_ml

def main():
    st.title('자동차 가격 예측')

    menu = ['Home','EDA','ML']

    choice = st.sidebar.selectbox('메뉴 선택', menu)

    if choice == menu[0]:
        run_home()
    elif choice == menu[1]:
        run_eda()  
       
    elif choice == menu[2]:
        run_ml()

if __name__ =='__main__':
    main()

 

(이하 app_home.py)

 

import streamlit as st

def run_home():
    st.subheader('이 앱은 고객 데이터와 자동차 구매데이터에 대한 내용입니다.')
    st.text('왼쪽 사이드바에서 원하는 항목을 선택하세요.')

 

(이하 app_eda.py)

 

import pandas as pd
import streamlit as st
import seaborn as sb
import matplotlib.pyplot as plt

def run_eda():
    st.subheader('데이터 분석')
   
    st.text('기본적인 데이터 분석입니다.')

    car_df = pd.read_csv('data/Car_Purchasing_Data.csv',encoding = 'ISO-8859-1')

 

- 라디오버튼을 이용해서, 데이터프레임과, 통계치를 선택해서 보여줄수 있도록 만든다.

    radio_menu = ['데이터프레임','통계치']
    selected = st.radio('선택하세요', radio_menu)
    # 선택한 것이 해당 변수에 저장이 된다.

    if selected == radio_menu[0]:
        st.dataframe(car_df)
    elif selected == radio_menu[1]:
        st.dataframe(car_df.describe())

 

(Streamlit 결과 화면)

 

- 컬럼명을 보여주고, 컬럼을 선택하면, 해당 컬럼의 최대값 데이터와, 최소값 데이터를 보여준다.

    car_list = car_df.columns[4:]
    selected_col = st.selectbox('최소값/최대값', car_list)

(Streamlit 결과 화면)

 

 -  연봉 제일 높은 사람

# car_df.loc[car_df['Annual Salary'] == car_df['Annual Salary'].max(),]

    df_max = car_df.loc[car_df[selected_col] == car_df[selected_col].max(),]
    df_min = car_df.loc[car_df[selected_col] == car_df[selected_col].min(),]

    st.text('{}컬럼의 최대값에 해당하는 데이터.'.format(selected_col))
    st.dataframe(df_max)

    st.text('{}컬럼의 최소값에 해당하는 데이터.'.format(selected_col))
    st.dataframe(df_min)

(Streamlit 결과 화면)

 

# 유저가 선택한 컬럼들만, pairplot 그리고 그 아래, 상관계수를 보여준다.

    selected_col2 = st.multiselect('상관계수 컬럼선택', car_list)
   
    if len(selected_col2) > 1:
        st.text('선택하신 컬럼끼리의 상관계수입니다.')
        st.dataframe(car_df[selected_col2].corr())
       
        fig1 = sb.pairplot(data = car_df[selected_col2])
        st.pyplot(fig1)

        fig2 = plt.figure() # 영역 잡아주고
        sb.heatmap(data = car_df[selected_col2].corr(),annot = True, fmt = '.2f',
           vmin = -1, vmax =1, cmap = 'coolwarm', linewidths = 0.5)
        st.pyplot(fig2)

    elif len(selected_col2) == 1:
        st.text('두 개이상의 컬럼을 선택해주세요.')
    else:
        st.text('컬럼을 선택해주십쇼')

 

fig2 = plt.figure() ~  st.pyplot(fig2)

matplot하고 searborn만 요런 문법 형식으로만 스트림릿에 반영된다. 

 

 

 

(Streamlit 결과 화면)

 

 고객 이름 컬럼을 검색할 수 있도록 만듭니다.

- he라고 넣으면, he가 이름에 들어가있는 고개들의 데이터를 가져옵니다.

 

    # 1. 유저한테 검색어를 입력받는다.
    word = st.text_input('이름을 검색할 단어를 입력하세요.')

    # 2. 검색어를 고객이름 컬럼에 들어있는 데이터 가져온다.
    result = car_df.loc[car_df['Customer Name'].str.lower().str.contains(word.lower()), ]

    # 3. 화면에 보여준다.
    st.dataframe(result)

 

(Streamlit 결과 화면)

 

(이하 app_ml.py)

- 주피터 노트북/ Colab에서 저장한 regressor, scaler_X, scaler_y를 현재 app.py가 있는 깃허브 ‘data’ 폴더 안에다가 이동해둔다.

import streamlit as st
import joblib
import numpy as np

def run_ml():
    st.subheader('자동차 구매 가능 금액 예측')

    regressor = joblib.load('data/regressor.pkl')

    scaler_X = joblib.load('data/scaler_X.pkl')
    scaler_y = joblib.load('data/scaler_y.pkl')

    # print(sklearn.__version)

    # 예측하기 위해서 필요한 파일들을 불러와야 된다.

    # 이 예에서는, 인공지능 파일, X 스케일러 파일, y 스케일러 파일

    # 3개를 불러와야 한다.

    # 변수이름도 같게 해준다. 헷갈리지 않게.

 

- 유저가 앱을 통해서 데이터를 입력했습니다. 이 사람은 얼마정도의 차를 구매할 수 있을지 예측해서, 그 사람에게 맞는 차를 보여주려 합니다.

ㄴ 여자이고, 나이는 38살, 연봉은 78,000달러, 카드 빚은 15,000달러이고, 자산은 480,000달러입니다.

 

 

# 성별, 나이, 연봉, 카드빚, 자산을 입력받도록 만드세요

    gender_list = ['남자','여자']
    gender = st.radio('성별입력',gender_list)
    if gender == '여자':
        gender = 0
    else:
        gender = 1

    # age = st.slider('나이',15,120)
    age = st.number_input('나이',0,120)
    salary = st.number_input('연봉 입력',0)
    deb = st.number_input('빚 입력',0)
    worth = st.number_input('자산 입력',0)

 

 

# 학습은 웹대시보드에서 시키는 것이 아니다.

ㄴ 주피터 노트북에서 확인한것만 vscode로 옮겨온다. 

 

# 1. 신규 고객의 정보를 넘파이 어레이로 만들어준다.

# 2. 학습할때 사용한 X의 피처 스케일러를 이용해서, 피처스케일링한다.

ㄴ 먼저, 데이터를 2차원으로 만들어준다.

# 3. 인공지능에게 예측해달라고 한다.

# 4. 예측한 값을, 원상복구 시킨다.

    if st.button('자동차 구매 금액 예측'):
        new_data = np.array([gender,age,salary,deb, worth])

        new_data = new_data.reshape(1,5)
        # 1행: 한명의 사람 정보, 5열: gender,age,salary,deb,worth
       
        new_data = scaler_X.transform(new_data)

        y_pred = regressor.predict(new_data)

        y_pred = scaler_y.inverse_transform(y_pred)

        y_pred = round(y_pred[0,0])

        st.write('이 사람의 구매 가능 금액은' + str(y_pred) + '달러 입니다.')

 

(Streamlit 결과 화면)

 

반응형