⚡데이터 가져와서 해당 구분자로 분리하고 원하는 열만 가져오기df_data = pd.read_csv('http://www.randomservices.org/random/data/Galton.txt', sep='\t', usecols=['Father', 'Gender', 'Height']) print(df_data.head(2)) # Father Gender Height #0 78.5 M 73.2 #1 78.5 F 69.2
⚡특정열의 특정값만 남기고, 해당열은 지워버리기
son_data = df_data[df_data['Gender'] == 'M'].drop('Gender' , axis = 1) # Father Height # 0 78.5 73.2 # 4 75.5 73.5
⚡특정 칼럼값 추출, 상관계수 분석
father_x = son_data.Father son_y = son_data.Height print('corrcoef : ', np.corrcoef(father_x, son_y))
⚡train / test 분리
from sklearn.model_selection import train_test_split train_x, test_x, train_y, test_y = train_test_split(father_x, son_y, test_size=0.3, random_state=1) print(train_x.shape, test_x.shape)
⚡Sequential api 모델
import tensorflow as tf from keras.models import Sequential from keras.layers import Dense # 1) 모델 네트워크 구성 model = Sequential() model.add(Dense(units=5, input_dim=1, activation='linear')) model.add(Dense(1, activation='linear')) print(model.summary()) # 2) 모델 학습 과정 설정 opti = tf.keras.optimizers.Adam(learning_rate=0.001) # adam 사용 model.compile(optimizer=opti, loss='mse', metrics=['mse']) # 3) 모델 학습 history = model.fit(x=train_x, y=train_y, epochs=50, batch_size=4, verbose=0) # 4) 모델 평가 loss_metrics = model.evaluate(x=test_x, y=test_y, verbose=0) print('loss metrics: ', loss_metrics) # loss metrics: [6.919643402099609, 6.919643402099609] # 5) 예측값 출력 print('실제값 : ', test_y.head().values) # 실제값 : [72. 70.5 66. 69. 72. ] print('예측값 : ', model.predict(test_x).flatten()[:5]) # 예측값 : [68.58027 69.07017 67.60047 68.58027 70.539856] # 6) 새로운 값 예측 new_height = [75, 70, 80] print('새로운 예측값: ', model.predict(new_height).flatten()) # 새로운 예측값: [74.45905 69.56007 79.35804] # 7) 시각화 import matplotlib.pyplot as plt plt.rc('font', family='malgun gothic') plt.plot(train_x, model.predict(train_x), 'b', train_x, train_y, 'ko') # train plt.show() plt.plot(test_x, model.predict(test_x), 'b', test_x, test_y, 'ko') # test plt.show() plt.plot(history.history['mse'], label='평균제곱오차') plt.xlabel('학습 횟수') plt.show()
⚡Function api 모델
from keras.layers import Input from keras.models import Model # 각 층은 일종의 함수처럼 처리함 inputs = Input(shape=(1,)) # 이전층을 다음층의 파라미터로 넣어주는게 포인트 output1 = Dense(units=5, activation='linear')(inputs) outputs = Dense(1, activation='linear')(output1) model2 = Model(inputs, outputs) print(model2.summary()) opti = tf.keras.optimizers.Adam(learning_rate=0.001) model2.compile(optimizer=opti, loss='mse', metrics=['mse']) history = model2.fit(x=train_x, y=train_y, epochs=50, batch_size=4, verbose=0) loss_metrics2 = model2.evaluate(x=test_x, y=test_y, verbose=0) print('loss metrics: ', loss_metrics2) print('실제값 : ', test_y.head().values) print('예측값 :', model2.predict(test_x).flatten()[:5]) new_data = [75, 70, 80] print('새로운 예측 키 값: ', model2.predict(new_data).flatten())
⚡ 상관계수 확인 예시
df = pd.read_csv("https://raw.githubusercontent.com/pykwon/python/master/data/train.csv", sep=',') df.drop(columns='datetime', inplace=True) # datetime열 빼기 # 상관계수 확인 co_re=df.corr() print(co_re['count'].sort_values(ascending=False) # count기준 상관계수 , 내림차순 #count 1.000000 #registered 0.970948 #casual 0.690414 #temp 0.394454 #atemp 0.389784 #season 0.163439 #windspeed 0.101369 #workingday 0.011594 #holiday -0.005393 #weather -0.128655 #humidity -0.317371 #Name: count, dtype: float64 # feature, label 나누기 x = df.loc[:,['registered','casual','temp','atemp','humidity']] # registered casual temp atemp humidity # 0 13 3 9.84 14.395 81 # 1 32 8 9.02 13.635 80 y = df.iloc[:,-1] # 0 16 # 1 40
⚡ 정규화
값을 0~1 사이로 Scaling
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0,1)) x= scaler.fit_transform(x)
⚡ 표준화
평균이 0 , 표준편차가 1로 Scaling
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() x_train = scaler.fit_transform(x_train) x_test = scaler.fit_transform(x_test)
⚡ 데이터 세트 Dummy Encoding
data = pd.read_csv('mushrooms.csv') print(data.head(3)) # class cap-shape cap-surface ... spore-print-color population habitat # 0 p x s ... k s u # 1 e x s ... n n g # 2 e b s ... n n m print(data.info()) # RangeIndex: 8124 entries, 0 to 8123 # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 class 8124 non-null object # 1 cap-shape 8124 non-null object # 2 cap-surface 8124 non-null object from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() for colname in data.columns: data[colname] = encoder.fit_transform(data[colname]) print(data.info()) # RangeIndex: 8124 entries, 0 to 8123 # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 class 8124 non-null int32 # 1 cap-shape 8124 non-null int32 # 2 cap-surface 8124 non-null int32
⚡ NaN 값 파악후 없애기
# 불러올 파일에 ? 값을 na로 대체했었던 dataset dataset = pd.read_csv('../testdata/auto-mpg.csv', na_values= '?') # nan 파악 print(dataset.isna().sum()) # mpg 0 # cylinders 0 # displacement 0 # horsepower 6 # weight 0 # acceleration 0 # model year 0 # origin 0 # dtype: int64 # nan 없애기 dataset = dataset.dropna() print(dataset.isna().sum()) # mpg 0 # cylinders 0 # displacement 0 # horsepower 0 # weight 0 # acceleration 0 # model year 0 # origin 0 # dtype: int64
⚡ 조기종료 (early stopping)
# loss가 5회 이내로 더 안떨어지면 조기종료하기 history = model.fit(x_train, y_train, epochs = 100, batch_size = 32, validation_split=0.25, callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)])
⚡ OneHotEncoder , make_column_transformer
train_df = pd.read_excel("../testdata/hd_carprice.xlsx", sheet_name='train') test_df = pd.read_excel("../testdata/hd_carprice.xlsx", sheet_name='test') print(train_df.head(2), train_df.shape) # 가격 년식 종류 연비 마력 토크 연료 하이브리드 배기량 중량 변속기 # 0 1885 2015 준중형 11.8 172 21.0 가솔린 0 1999 1300 자동 # 1 2190 2015 준중형 12.3 204 27.0 가솔린 0 1591 1300 자동 (71, 11) print(test_df.head(2), test_df.shape) # 가격 년식 종류 연비 마력 토크 연료 하이브리드 배기량 중량 변속기 # 0 1915 2015 대형 6.8 159 23.0 LPG 0 2359 1935 수동 # 1 1164 2012 소형 13.3 108 13.9 가솔린 0 1396 1035 자동 (31, 11) # 전처리 x_train = train_df.drop(['가격'], axis=1) # feature x_test = test_df.drop(['가격'], axis=1) y_train = train_df[['가격']] # label y_test = test_df[['가격']] print(x_train.head(2), x_train.shape, x_train.columns) # 년식 종류 연비 마력 토크 연료 하이브리드 배기량 중량 변속기 # 0 2015 준중형 11.8 172 21.0 가솔린 0 1999 1300 자동 # 1 2015 준중형 12.3 204 27.0 가솔린 0 1591 1300 자동 (71, 10) Index(['년식', '종류', '연비', '마력', '토크', '연료', '하이브리드', '배기량', '중량', '변속기'], dtype='object') print(set(x_train.종류)) # {'대형', '준중형', '소형', '중형'} print(set(x_train.연료)) # {'LPG', '가솔린', '디젤'} print(set(x_train.변속기)) # {'자동', '수동'} # OneHotEncoder로 해보기 from sklearn.preprocessing import OneHotEncoder # 3개를 한꺼번에 하기 --> make_column_transformer 사용 from sklearn.compose import make_column_transformer transform = make_column_transformer((OneHotEncoder(), ['종류','연료','변속기']), remainder='passthrough') transform.fit(x_train) x_train = transform.transform(x_train) # 세 개의 열이 참여해 원핫 수행 후 모든 칼럼을 표준화 x_test = transform.transform(x_test) print(x_train[:2]) # 16개 / 9-3 + 10 # [[0.000e+00 0.000e+00 1.000e+00 0.000e+00 0.000e+00 1.000e+00 0.000e+00 # 0.000e+00 1.000e+00 2.015e+03 1.180e+01 1.720e+02 2.100e+01 0.000e+00 # 1.999e+03 1.300e+03] # [0.000e+00 0.000e+00 1.000e+00 0.000e+00 0.000e+00 1.000e+00 0.000e+00 # 0.000e+00 1.000e+00 2.015e+03 1.230e+01 2.040e+02 2.700e+01 0.000e+00 # 1.591e+03 1.300e+03]] print(x_train.shape) # (71, 16) print(y_train.shape) # (71, 1)