!pip install tsfresh
import os
os.kill(os.getpid(), 9)
robot execution
from tsfresh.examples.robot_execution_failures import download_robot_execution_failures, load_robot_execution_failures
download_robot_execution_failures()
timeseries
: 데이터 피쳐 값(독립 변수)timeseries, y = load_robot_execution_failures()
timeseries
y
: 종속변수from tsfresh import extract_features
extracted_features = extract_features(timeseries, column_id="id", column_sort="time")
extracted_features
-inf
-> min
+inf
-> max
NaN
-> median
select_features(X, y)
from tsfresh import select_features
from tsfresh.utilities.dataframe_functions import impute
# impute
impute(extracted_features)
# select_features(X, y)
features_filtered = select_features(extracted_features, y)
features_filtered
Sum of Squares for Error(오차제곱합)
Accuracy(정확도)
Precision(정밀도)
Recall(재현율)
F1-score(조화 평균)
robot_execution_failures
데이터셋 사용from tsfresh.examples.robot_execution_failures import download_robot_execution_failures, load_robot_execution_failures
download_robot_execution_failures()
timeseries, y = load_robot_execution_failures()
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
클래스별 테스트 데이터 개수 계산
y.sum()
: True 값 개수 반환(양성 클래스 총 개수)len(y) - y.sum()
: False 값 개수 반환(음성 클래스 총 개수)테스트 데이터 인덱스 선택
num_false
만큼의 상위 데이터 선택def custom_classification_split(x, y, test_size=0.3):
# 클래스별 테스트 데이터 개수 계산
num_true = int(y.sum()*test_size) # int(21 * 0.3) = 6
num_false = int((len(y)-y.sum())*test_size) # int((88 - 21)*0.3) = 20
# 테스트 데이터 인덱스 선택
id_list = y[y==False].head(num_false).index.to_list() + y[y==True].head(num_true).index.to_list()
y_train = y.drop(id_list)
y_test = y.iloc[id_list].sort_index()
X_train = x[~x['id'].isin(id_list)]
X_test = x[x['id'].isin(id_list)]
return X_train, y_train, X_test, y_test
X_train, y_train, X_test, y_test = custom_classification_split(timeseries, y)
print(X_train)
print('-'*50)
print(y_train)
print('-'*50)
print(X_test)
print('-'*50)
print(y_test)
MinimalFCParameters
from tsfresh import extract_features
from tsfresh.feature_extraction import MinimalFCParameters
settings = MinimalFCParameters()
minimal_features_train = extract_features(
X_train,
column_id="id",
column_sort="time",
default_fc_parameters=settings
)
minimal_features_test = extract_features(
X_test,
column_id="id",
column_sort="time",
default_fc_parameters=settings
)
plt.plot(minimal_features_train['F_x__sum_values'])
plt.show()
➡️ 앞 부분은 잘 유지되나, x=60 이후부터 값 변동이 심하기 때문에, 이 부분부터 데이터 노이즈가 있음을 알 수 있음
plt.plot(minimal_features_train['T_z__maximum'])
plt.show()
➡️ 위와 비슷한 형태, 극단값에 해당되어서 이런 형태가 나타나는 건지?
logistic = LogisticRegression()
logistic.fit(minimal_features_train, y_train)
logistic.score(minimal_features_test, y_test)
macro avg
: 매크로 평균(평균의 평균), 각 클래스별 평균 / 클래스weighted avg
: 가중 산술 평균(가중치 부여하여 구한 평균)classification_report(y_test, logistic.predict(minimal_features_test), target_names=['true', 'false'], output_dict=True)
해석
Precision
- false에 대해서는 잘못된 결과를 내는 경우가 많음(False 예측값 중 실제 Falserk 42.8%)
Recall
- True의 재현율이 다소 낮음
F1-Score
- False는 좋지 않은 성능
Accuracy
- 정확도는 70% 수준(중간 정도)
Macro Avg
- 클래스 간 불균형이 고려되지 않아서 좋지 못함
Weighted Avg
- 클래스 불균형을 반영한 값이라, 조금 더 나은 값을 보임