<jupyter_start><jupyter_text>샘플 데이터 생성OCSVM은 Unsupervised Learning Method 중 하나이며, Novelty Detection에서 사용되는 방법 중 하나이다. 따라서, 모든 데이터를 정상이라고 가정하고 모델 훈련을 수행해야 한다.샘플 데이터를 생성하는 과정은 다음과 같다.- PyoD 라이브러리를 사용하여 샘플 데이터 생성. 이 때, 실제 Outlier 비율은 전체 데이터의 5%로 지정한다.- 전체 데이터에서 훈련 데이터와 테스트 데이터를 분할한다.<jupyter_code>train, test = generate_data(random_state = 42, train_only = True, contamination = 0.05)
X_train, X_test, y_train, y_test = train_test_split(train, test, test_size = 0.2, random_state = 42)<jupyter_output><empty_output><jupyter_text>모델 적합앞서 말했듯이, OCSVM은 라벨 데이터를 필요로하지 않는다. 따라서, 피쳐 데이터만을 이용해 모델을 적합시킨다.<jupyter_code>clf = svm.OneClassSVM(nu = 0.1, kernel = 'rbf', gamma = 0.1)
clf.fit(X_train) # Unsupervised Learning Method<jupyter_output><empty_output><jupyter_text>적합 모델을 이용한 라벨 분류<jupyter_code>class OCSVM:
    def __init__(self, nu, kernel, gamma):
        self.nu = nu
        self.kernel = kernel
        self.gamma = gamma
        self.result_df = pd.DataFrame()
        
        self.clf = svm.OneClassSVM(nu = self.nu, kernel = self.kernel, gamma = self.gamma)
        
    def fit(self, X_train, ground_truth):
        self.X_train = X_train
        self.y_train = ground_truth
        
        self.clf.fit(self.X_train)
        
        return self.clf
    
    def predict(self, X_test, is_return = False):
        self.X_test = X_test
        
        self.prediction = self.clf.predict(self.X_test)
        
        if is_return:
            
            return self.prediction
    
    def visualization(self):
        self.result_df['X1'] = self.X_train[:, 0]
        self.result_df['X2'] = self.X_train[:, 1]
        self.result_df['Prediction'] = pd.Series(self.prediction).apply(lambda x: 0 if x == 1 else 1)
        self.result_df['Actual'] = self.y_train
        
        xx, yy = np.meshgrid(np.linspace(self.result_df['X1'].min() - 1, self.result_df['X1'].max() + 1, 500),
                            np.linspace(self.result_df['X2'].min() - 1, self.result_df['X2'].max() + 1, 500))
        
        z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
        z = z.reshape(xx.shape)
        
        plt.title("Novelty Detection\nNu = {}, Kernel = {}, Gamma = {}".format(self.nu, self.kernel, self.gamma))
        plt.contourf(xx, yy, levels = np.linspace(z.min(), 0, 7), cmap = plt.cm.PuBu)
        a = plt.contourf(xx, yy, z, level = [0], linewidths = 2, color = 'darkred')
        plt.contourf(xx, yy, z, levels=[0, z.max()], colors='palevioletred')

        s = 40
        b1 = plt.scatter(self.X_train[:, 0], self.X_train[:, 1], c = 'white', s = s, edgecolors = 'k')
        outlier = plt.scatter(self.result_df.loc[self.result_df['Prediction'] == 1]['X1'], self.result_df.loc[self.result_df['Prediction'] == 1]['X2'],
                             c = 'red', edgecolor = 'k')
        actual = plt.scatter(self.result_df.loc[self.result_df['Actual'] == 1]['X1'], self.result_df.loc[self.result_df['Actual'] == 1]['X2'],
                            c = 'gold', edgecolor = 'k', alpha = 0.8)
        
        plt.axis('tight')
        plt.xlim((self.result_df['X1'].min() - 1, self.result_df['X1'].max() + 1))
        plt.ylim((self.result_df['X2'].min() - 1, self.result_df['X2'].max() + 1))
        
        plt.show()
nu = 0.1
kernel = 'rbf'
gamma = 0.007

model = OCSVM(nu = nu, kernel = kernel, gamma = gamma)
model.fit(X_train, y_train)
model.predict(X_train)<jupyter_output><empty_output><jupyter_text>시각화<jupyter_code>model.visualization()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15500999143591207, 'fraction_numerical': 0.01969740222666286, 'mean_word_length': 2.7158006362672324, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '6620', 'license': 'MIT', 'n_tokens_mistral': 1542, 'n_tokens_neox': 1604, 'n_words': 265, 'path': 'ipynb/OCSVM.ipynb', 'repo_name': 'SSANGMAN/Anomaly_Detection', 'size': '3503'}