<jupyter_start><jupyter_text>Porównanie ze sobą kilku modeli uczenia maszynowego,  wybranie najbardziej optymalnego do rozwiązywanego problemu (klasyfikacja newsów) 1. Import pliku zip z dysku i rozpakowanie pliku json<jupyter_code>from google.colab import files

uploaded = files.upload()

!unzip -q news.zip<jupyter_output><empty_output><jupyter_text>2. Wczytanie zawartości pliku do obiektu DataFrame<jupyter_code>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

raw_data = pd.read_json('News_Category_Dataset_v2.json', lines=True)
raw_data.head()<jupyter_output><empty_output><jupyter_text>3. Separacja potrzebnych kolumn i analiza danych<jupyter_code>df = raw_data[['category', 'short_description']].copy()
df.head(3)
df.isna().sum()
df.drop_duplicates(inplace=True)
plt.title("News category %", y=1.02, fontdict={'fontsize': 24});
df['category'].value_counts().plot(kind='pie', figsize=(30,15), autopct="%.1f%%")<jupyter_output><empty_output><jupyter_text>4. Resampling danych w celu uzyskania takiej samej liczby danych dla każdej klasy<jupyter_code>from imblearn.over_sampling import RandomOverSampler

X = df[['short_description']]
y = df[['category']]

ros = RandomOverSampler(random_state=0)

X_resampled, y_resampled = ros.fit_resample(X, y)

ser1 = pd.Series(X_resampled.ravel())
ser2 = pd.Series(y_resampled)

data_res = pd.DataFrame(data=ser1, columns=['description'])
data_res['category'] = ser2
plt.title("News category % (after resampling)", y=1.02, fontdict={'fontsize': 24});
data_res['category'].value_counts().plot(kind='pie', figsize=(30,15), autopct="%.1f%%")
print(f'liczba rekordów przed resamplingiem: {len(df)}')
print(f'liczba rekordów po resamplingu: {len(data_res)}')<jupyter_output>liczba rekordów przed resamplingiem: 178944
liczba rekordów po resamplingu: 1196667<jupyter_text>5. Zakodowanie kategorii oraz oczyszczenie tekstu w kolumnie z opisem<jupyter_code>import nltk
nltk.download('punkt')
nltk.download('stopwords')
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import string
def clean(text):

  tokens = word_tokenize(text)
  tokens = [w.lower() for w in tokens]

  table = str.maketrans('', '', string.punctuation)
  stripped = [w.translate(table) for w in tokens]

  words = [word for word in stripped if word.isalpha()]

  stop_words = set(stopwords.words('english'))
  words = [w for w in words if not w in stop_words]

  cleaned_text = ' '.join(words)

  return cleaned_text
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le.fit(data_res['category'])
data_res['category'] = le.transform(data_res['category'])
data_res['description'] = data_res['description'].map(lambda x: clean(x))
data_res.head()<jupyter_output><empty_output><jupyter_text>6. Wymieszanie danych<jupyter_code>data_res = data_res.sample(frac=1).reset_index(drop=True)<jupyter_output><empty_output><jupyter_text>7. Wektoryzacja danych tektowych w celu umożliwienia zastosowania ich w modelu uczącym<jupyter_code>from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(data_res['description'])
y = data_res['category']<jupyter_output><empty_output><jupyter_text>8. Podział na zbiór treningowy i testowy<jupyter_code>from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)<jupyter_output><empty_output><jupyter_text>9. Testowanie modeli (ustawienia domyślne)*   LinearSVC<jupyter_code>from sklearn.svm import LinearSVC

model1 = LinearSVC()
model1.fit(X_train, y_train)

print(f'Dokładność modelu: {model1.score(X_test, y_test)*100:.2f} %')<jupyter_output>Dokładność modelu: 89.58 %<jupyter_text>*   SGDClassifier<jupyter_code>from sklearn.linear_model import SGDClassifier

model2 = SGDClassifier()
model2.fit(X_train, y_train)

print(f'Dokładność modelu: {model2.score(X_test, y_test)*100:.2f} %')<jupyter_output>Dokładność modelu: 72.67 %<jupyter_text>*   MultinomialNB<jupyter_code>from sklearn.naive_bayes import MultinomialNB

model3 = MultinomialNB()
model3.fit(X_train, y_train)

print(f'Dokładność modelu: {model3.score(X_test, y_test)*100:.2f} %')<jupyter_output>Dokładność modelu: 71.78 %
{'fraction_non_alphanumeric': 0.125, 'fraction_numerical': 0.019686907020872866, 'mean_word_length': 8.049356223175966, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '294406', 'license': 'MIT', 'n_tokens_mistral': 1704, 'n_tokens_neox': 1671, 'n_words': 306, 'path': 'news_classification_models_comparison.ipynb', 'repo_name': 'robmaz22/news_category_classification', 'size': '4216'}