waliullah123 commited on
Commit
7a0a647
·
verified ·
1 Parent(s): 0d94a87

Upload dl_model.py

Browse files
Files changed (1) hide show
  1. dl_model.py +120 -0
dl_model.py ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ dl_model.py
3
+ Deep Learning Module — Native Multi-Layer Perceptron (MLP) Classifier.
4
+ Replacing PyTorch BiLSTM to support host environments without CPU AVX/AVX2 support.
5
+ """
6
+
7
+ import os
8
+ import re
9
+ import numpy as np
10
+ import pandas as pd
11
+ from sklearn.base import BaseEstimator, ClassifierMixin
12
+ from sklearn.feature_extraction.text import TfidfVectorizer
13
+ from sklearn.pipeline import Pipeline
14
+ from sklearn.preprocessing import MaxAbsScaler
15
+ from sklearn.neural_network import MLPClassifier
16
+ from sklearn.pipeline import FeatureUnion
17
+
18
+ class DeepNewsClassifier(BaseEstimator, ClassifierMixin):
19
+ """
20
+ §3.3.2 Deep Learning Module — Native MLP Neural Network Classifier.
21
+ Exposes sklearn-standard methods (fit, predict, predict_proba)
22
+ so it works seamlessly in Pipeline, StackingClassifier, and joblib serialization.
23
+ """
24
+
25
+ def __init__(self, hidden_layer_sizes=(128, 64, 32), max_iter=30,
26
+ learning_rate_init=0.001, batch_size=32, random_state=42):
27
+ self.hidden_layer_sizes = hidden_layer_sizes
28
+ self.max_iter = max_iter
29
+ self.learning_rate_init = learning_rate_init
30
+ self.batch_size = batch_size
31
+ self.random_state = random_state
32
+
33
+ self.pipeline = None
34
+ self.classes_ = np.array([0, 1])
35
+
36
+ def _extract_statements(self, X):
37
+ if isinstance(X, pd.DataFrame):
38
+ return X['statement'].fillna('').astype(str).tolist()
39
+ elif isinstance(X, pd.Series):
40
+ return X.fillna('').astype(str).tolist()
41
+ elif isinstance(X, np.ndarray):
42
+ if X.ndim > 1:
43
+ return X[:, 0].astype(str).tolist()
44
+ return X.astype(str).tolist()
45
+ elif isinstance(X, list):
46
+ return [str(item) for item in X]
47
+ return [str(X)]
48
+
49
+ def fit(self, X, y):
50
+ # Extract statements text
51
+ statements = self._extract_statements(X)
52
+ y = np.array(y).astype(int)
53
+
54
+ # Word-level TF-IDF
55
+ word_vectorizer = TfidfVectorizer(
56
+ analyzer='word',
57
+ ngram_range=(1, 2),
58
+ max_features=5000
59
+ )
60
+
61
+ # Char-level TF-IDF (captures sequence sub-words/suffixes)
62
+ char_vectorizer = TfidfVectorizer(
63
+ analyzer='char',
64
+ ngram_range=(3, 5),
65
+ max_features=5000
66
+ )
67
+
68
+ combined_features = FeatureUnion([
69
+ ('word_tfidf', word_vectorizer),
70
+ ('char_tfidf', char_vectorizer)
71
+ ])
72
+
73
+ # MLP Neural Network pipeline
74
+ self.pipeline = Pipeline([
75
+ ('features', combined_features),
76
+ ('scaler', MaxAbsScaler()),
77
+ ('mlp', MLPClassifier(
78
+ hidden_layer_sizes=self.hidden_layer_sizes,
79
+ max_iter=self.max_iter,
80
+ learning_rate_init=self.learning_rate_init,
81
+ batch_size=self.batch_size,
82
+ random_state=self.random_state,
83
+ activation='relu',
84
+ solver='adam',
85
+ verbose=True,
86
+ early_stopping=True,
87
+ validation_fraction=0.1
88
+ ))
89
+ ])
90
+
91
+ print(f"Training Native MLP Deep Neural Network Classifier: Hidden Layers={self.hidden_layer_sizes}, Epochs={self.max_iter}")
92
+ self.pipeline.fit(statements, y)
93
+ self.classes_ = self.pipeline.classes_
94
+ return self
95
+
96
+ def predict_proba(self, X):
97
+ if self.pipeline is None:
98
+ raise ValueError("Model has not been trained. Execute fit() first.")
99
+ statements = self._extract_statements(X)
100
+ return self.pipeline.predict_proba(statements)
101
+
102
+ def predict(self, X):
103
+ if self.pipeline is None:
104
+ raise ValueError("Model has not been trained. Execute fit() first.")
105
+ statements = self._extract_statements(X)
106
+ return self.pipeline.predict(statements)
107
+
108
+ def get_params(self, deep=True):
109
+ return {
110
+ 'hidden_layer_sizes': self.hidden_layer_sizes,
111
+ 'max_iter': self.max_iter,
112
+ 'learning_rate_init': self.learning_rate_init,
113
+ 'batch_size': self.batch_size,
114
+ 'random_state': self.random_state
115
+ }
116
+
117
+ def set_params(self, **params):
118
+ for param, value in params.items():
119
+ setattr(self, param, value)
120
+ return self