0

I'm trying to import KerasClassifier into VScode but i keep getting this error

ModuleNotFoundError Traceback (most recent call last) Cell In[7], line 1 1 from tensorflow.keras.wrappers.scikit_learn import KerasClassifier

ModuleNotFoundError: No module named 'tensorflow.keras.wrappers'

Does anyone know a way to fix it or another way around it? Here's my full code for context:

import pandas as pd
import re
from sklearn.model_selection import GridSearchCV
import numpy as np
import datetime
from pandas.tseries.offsets import MonthEnd
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier

df = pd.read_csv('Billing_Report_w_Revshare Calc.csv')

df['Date'] = pd.to_datetime(df['Date'])
df['Date'] = df['Date'].apply(lambda dt: dt.replace(day=30) if dt.month == 6 else dt)

df = df.dropna(subset=['Domain'])

def modify_url_suffix(url):
    pattern = r'\.(?!net|co|org|news|tv|pr|us|edu)([a-z]+)$'
    modified_url = re.sub(pattern, '.com', url, flags=re.I)
    return modified_url

df['Domain'] = df['Domain'].apply(modify_url_suffix)

df = df[['Date', 'Domain', 'DFP Group Code', 'Program Code', 'Total Agency Ad Requests',
         'Total Agency Impressions', 'Total DFP Impressions', 'Reporting Impressions', 'Total Rev',
         'Total Active View eligible impressions', 'Total Active View measurable impressions',
         'Total Active View viewable impressions', 'Customer Rev Share']]

df = df[df['Date'] > '2017-04-01']
df['Customer Rev Share'] = df['Customer Rev Share'].abs()
df = df.groupby(['Date', 'Domain', 'DFP Group Code', 'Program Code']).sum().reset_index()

def calculate_net_cpm(row):
    try:
        return round((row['Total Rev'] * 1000 / row['Total Agency Impressions']) * 0.78, 2)
    except (ZeroDivisionError, Exception):
        return 0

df['net_cpm'] = df.apply(calculate_net_cpm, axis=1)

last_day_previous_month = pd.to_datetime('today') - pd.tseries.offsets.MonthEnd(1)
previous_month_year = last_day_previous_month.year
previous_month_month = last_day_previous_month.month
df_previous_month = df[(df['Date'].dt.year == previous_month_year) & (df['Date'].dt.month == previous_month_month)]
previous_month_domains = df_previous_month['Domain'].unique()
df = df[df['Domain'].isin(previous_month_domains)]

yup_df = df.loc[(df['Program Code'] == 'YUP') & (df['Date'].dt.year == previous_month_year) & (df['Date'].dt.month == previous_month_month)]
yup_df = yup_df[['Domain']]
df = df[df['Domain'].isin(yup_df['Domain'])]

df = df.sort_values(['Domain', 'Date'])

df = df[['Date', 'Domain', 'Total Agency Ad Requests',
         'Total Agency Impressions', 'Total DFP Impressions', 'Reporting Impressions', 'Total Rev',
         'Total Active View eligible impressions', 'Total Active View measurable impressions',
         'Total Active View viewable impressions', 'Customer Rev Share', 'net_cpm']]

count_per_domain = df['Domain'].value_counts()
sufficient_data_domains = count_per_domain[count_per_domain > 4].index
df_sufficient_data = df[df['Domain'].isin(sufficient_data_domains)]
df_insufficient_data = df[~df['Domain'].isin(sufficient_data_domains)]

df_sufficient_data = df_sufficient_data.sort_values(['Domain', 'Date'], ascending=[True, True])

feature_scaler = MinMaxScaler()
numeric_columns = ['Total Agency Ad Requests', 'Total Agency Impressions', 'Total DFP Impressions', 
                   'Reporting Impressions', 'Total Rev', 'Total Active View eligible impressions', 
                   'Total Active View measurable impressions', 'Total Active View viewable impressions', 
                   'Customer Rev Share']

df_sufficient_data[numeric_columns] = feature_scaler.fit_transform(df_sufficient_data[numeric_columns])

time_steps = 5

def reshape_to_3d(arr, time_steps):
    x = []
    for i in range(len(arr) - time_steps):
        x.append(arr[i: (i + time_steps)])
    return np.array(x)

X = []  
y = []  

encoder = LabelEncoder()
encoder.fit(df_sufficient_data['net_cpm'])
num_classes = len(encoder.classes_)

for domain in df_sufficient_data['Domain'].unique():
    domain_data = df_sufficient_data[df_sufficient_data['Domain'] == domain]
    domain_data = domain_data.drop(['Date', 'Domain'], axis=1)
    
    domain_data[numeric_columns] = feature_scaler.transform(domain_data[numeric_columns])

    encoded_y = encoder.transform(domain_data['net_cpm'])
    dummy_y = to_categorical(encoded_y, num_classes=num_classes)
    
    X_domain = domain_data.drop('net_cpm', axis=1).values
    
    X_domain_3d = reshape_to_3d(X_domain, time_steps)
    y_domain = dummy_y[time_steps:]

    if X_domain_3d.ndim == 3 and y_domain.ndim == 2:
        X.append(X_domain_3d)
        y.append(y_domain)

X = np.concatenate(X)
y = np.concatenate(y)

print("Shape of X:", X.shape)
print("Shape of y:", y.shape)

def create_model(lstm_units=50, learning_rate=0.01):
    model = Sequential()
    model.add(LSTM(lstm_units, activation='relu', input_shape=(5, 9)))
    model.add(Dense(580, activation='softmax'))

    optimizer = Adam(learning_rate=learning_rate)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model

model = KerasClassifier(build_fn=create_model, epochs=10, batch_size=32, verbose=1)

param_grid = {'lstm_units': [30, 50, 70], 'learning_rate': [0.001, 0.01, 0.1]}

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=3)
grid_result = grid.fit(X, y)

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

final_model = create_model(lstm_units=grid_result.best_params_['lstm_units'], learning_rate=grid_result.best_params_['learning_rate'])

final_model.fit(X, y, epochs=10, batch_size=32, validation_split=0.2)

I've tried creating my own custom wrapper but i'm having issues with that.

Tony H
  • 25
  • 2

1 Answers1

0

There is a high chance that there is a version mismatch between keras and tensorflow, refer here. As you have not provided the information about platform and library versions, I can't make sure of that, but I will encourage you to include details about the platform and the library versions used, so correct answers can be provided.

Answer: Make sure the correct keras version according to tensorflow version is installed.

  • Apologies, these are the versions i have installed: Keras version: 2.13.1 TensorFlow version: 2.13.0 – Tony H Jul 07 '23 at 20:31
  • I have tf=2.12.0 and keras=2.12.0 and I am able to importthe library with no error. Maybe if you make sure to install keras=2.13.0 same as your tf version, it might work – Obaidullah Zaland Jul 07 '23 at 20:46
  • There doesn't seem to be a matching keras version. I just back dated to 2.12.0 for both and it worked. Looks like it was just a compatibility issue. – Tony H Jul 07 '23 at 20:54