{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":2020493,"sourceType":"datasetVersion","datasetId":1209379},{"sourceId":72929774,"sourceType":"kernelVersion"},{"sourceId":115003,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":96587,"modelId":120770}],"dockerImageVersionId":31012,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n for filename in filenames:\n print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:51.929874Z","iopub.execute_input":"2025-05-20T14:53:51.930385Z","iopub.status.idle":"2025-05-20T14:53:51.949747Z","shell.execute_reply.started":"2025-05-20T14:53:51.930349Z","shell.execute_reply":"2025-05-20T14:53:51.948340Z"}},"outputs":[{"name":"stdout","text":"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\n","output_type":"stream"}],"execution_count":7},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:51.952143Z","iopub.execute_input":"2025-05-20T14:53:51.952474Z","iopub.status.idle":"2025-05-20T14:53:53.869665Z","shell.execute_reply.started":"2025-05-20T14:53:51.952449Z","shell.execute_reply":"2025-05-20T14:53:53.868593Z"}},"outputs":[],"execution_count":8},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:53.870648Z","iopub.execute_input":"2025-05-20T14:53:53.871163Z","iopub.status.idle":"2025-05-20T14:53:53.945876Z","shell.execute_reply.started":"2025-05-20T14:53:53.871138Z","shell.execute_reply":"2025-05-20T14:53:53.945061Z"}},"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":" product_name \\\n0 The Ordinary Natural Moisturising Factors + HA... \n1 CeraVe Facial Moisturising Lotion SPF 25 52ml \n2 The Ordinary Hyaluronic Acid 2% + B5 Hydration... \n3 AMELIORATE Transforming Body Lotion 200ml \n4 CeraVe Moisturising Cream 454g \n... ... \n1133 Elemis Life Elixirs Embrace Bath and Shower El... \n1134 Love Boo Splendidly Soothing Bath Soak (250ml) \n1135 Elemis Life Elixirs Fortitude Bath and Shower ... \n1136 Connock London Kukui Oil Soothing Bath & Showe... \n1137 Weleda Baby Calendula Cream Bath (200ml) \n\n product_url product_type \\\n0 https://www.lookfantastic.com/the-ordinary-nat... Moisturiser \n1 https://www.lookfantastic.com/cerave-facial-mo... Moisturiser \n2 https://www.lookfantastic.com/the-ordinary-hya... Moisturiser \n3 https://www.lookfantastic.com/ameliorate-trans... Moisturiser \n4 https://www.lookfantastic.com/cerave-moisturis... Moisturiser \n... ... ... \n1133 https://www.lookfantastic.com/elemis-life-elix... Bath Oil \n1134 https://www.lookfantastic.com/love-boo-splendi... Bath Oil \n1135 https://www.lookfantastic.com/elemis-life-elix... Bath Oil \n1136 https://www.lookfantastic.com/connock-london-k... Bath Oil \n1137 https://www.lookfantastic.com/weleda-baby-cale... Bath Oil \n\n clean_ingreds price \n0 ['capric triglyceride', 'cetyl alcohol', 'prop... £5.20 \n1 ['homosalate', 'glycerin', 'octocrylene', 'eth... £13.00 \n2 ['sodium hyaluronate', 'sodium hyaluronate', '... £6.20 \n3 ['ammonium lactate', 'c12-15', 'glycerin', 'pr... £22.50 \n4 ['glycerin', 'cetearyl alcohol', 'capric trigl... £16.00 \n... ... ... \n1133 ['prunus amygdalus dulcis', 'tipa-laureth sulf... £55.00 \n1134 ['sodium lauroyl', 'sodium cocoamphoacetate', ... £10.99 \n1135 ['prunus amygdalus dulcis', 'tipa-laureth sulf... £55.00 \n1136 ['capric triglyceride', 'peg-40 sorbitan perol... £36.00 \n1137 ['prunus amygdalus dulcis', 'sesamium indicum ... £13.95 \n\n[1138 rows x 5 columns]","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
product_nameproduct_urlproduct_typeclean_ingredsprice
0The Ordinary Natural Moisturising Factors + HA...https://www.lookfantastic.com/the-ordinary-nat...Moisturiser['capric triglyceride', 'cetyl alcohol', 'prop...£5.20
1CeraVe Facial Moisturising Lotion SPF 25 52mlhttps://www.lookfantastic.com/cerave-facial-mo...Moisturiser['homosalate', 'glycerin', 'octocrylene', 'eth...£13.00
2The Ordinary Hyaluronic Acid 2% + B5 Hydration...https://www.lookfantastic.com/the-ordinary-hya...Moisturiser['sodium hyaluronate', 'sodium hyaluronate', '...£6.20
3AMELIORATE Transforming Body Lotion 200mlhttps://www.lookfantastic.com/ameliorate-trans...Moisturiser['ammonium lactate', 'c12-15', 'glycerin', 'pr...£22.50
4CeraVe Moisturising Cream 454ghttps://www.lookfantastic.com/cerave-moisturis...Moisturiser['glycerin', 'cetearyl alcohol', 'capric trigl...£16.00
..................
1133Elemis Life Elixirs Embrace Bath and Shower El...https://www.lookfantastic.com/elemis-life-elix...Bath Oil['prunus amygdalus dulcis', 'tipa-laureth sulf...£55.00
1134Love Boo Splendidly Soothing Bath Soak (250ml)https://www.lookfantastic.com/love-boo-splendi...Bath Oil['sodium lauroyl', 'sodium cocoamphoacetate', ...£10.99
1135Elemis Life Elixirs Fortitude Bath and Shower ...https://www.lookfantastic.com/elemis-life-elix...Bath Oil['prunus amygdalus dulcis', 'tipa-laureth sulf...£55.00
1136Connock London Kukui Oil Soothing Bath & Showe...https://www.lookfantastic.com/connock-london-k...Bath Oil['capric triglyceride', 'peg-40 sorbitan perol...£36.00
1137Weleda Baby Calendula Cream Bath (200ml)https://www.lookfantastic.com/weleda-baby-cale...Bath Oil['prunus amygdalus dulcis', 'sesamium indicum ...£13.95
\n

1138 rows × 5 columns

\n
"},"metadata":{}}],"execution_count":9},{"cell_type":"code","source":"print(\"Available columns:\", df.columns.tolist())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:53.947489Z","iopub.execute_input":"2025-05-20T14:53:53.947808Z","iopub.status.idle":"2025-05-20T14:53:53.952728Z","shell.execute_reply.started":"2025-05-20T14:53:53.947780Z","shell.execute_reply":"2025-05-20T14:53:53.951707Z"}},"outputs":[{"name":"stdout","text":"Available columns: ['product_name', 'product_url', 'product_type', 'clean_ingreds', 'price']\n","output_type":"stream"}],"execution_count":10},{"cell_type":"code","source":"df['combined_features'] = (\n df['product_type'].fillna('') + ' ' +\n df['clean_ingreds'].fillna('')\n)\ndf","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:53.954980Z","iopub.execute_input":"2025-05-20T14:53:53.955280Z","iopub.status.idle":"2025-05-20T14:53:53.983348Z","shell.execute_reply.started":"2025-05-20T14:53:53.955258Z","shell.execute_reply":"2025-05-20T14:53:53.982467Z"}},"outputs":[{"execution_count":11,"output_type":"execute_result","data":{"text/plain":" product_name \\\n0 The Ordinary Natural Moisturising Factors + HA... \n1 CeraVe Facial Moisturising Lotion SPF 25 52ml \n2 The Ordinary Hyaluronic Acid 2% + B5 Hydration... \n3 AMELIORATE Transforming Body Lotion 200ml \n4 CeraVe Moisturising Cream 454g \n... ... \n1133 Elemis Life Elixirs Embrace Bath and Shower El... \n1134 Love Boo Splendidly Soothing Bath Soak (250ml) \n1135 Elemis Life Elixirs Fortitude Bath and Shower ... \n1136 Connock London Kukui Oil Soothing Bath & Showe... \n1137 Weleda Baby Calendula Cream Bath (200ml) \n\n product_url product_type \\\n0 https://www.lookfantastic.com/the-ordinary-nat... Moisturiser \n1 https://www.lookfantastic.com/cerave-facial-mo... Moisturiser \n2 https://www.lookfantastic.com/the-ordinary-hya... Moisturiser \n3 https://www.lookfantastic.com/ameliorate-trans... Moisturiser \n4 https://www.lookfantastic.com/cerave-moisturis... Moisturiser \n... ... ... \n1133 https://www.lookfantastic.com/elemis-life-elix... Bath Oil \n1134 https://www.lookfantastic.com/love-boo-splendi... Bath Oil \n1135 https://www.lookfantastic.com/elemis-life-elix... Bath Oil \n1136 https://www.lookfantastic.com/connock-london-k... Bath Oil \n1137 https://www.lookfantastic.com/weleda-baby-cale... Bath Oil \n\n clean_ingreds price \\\n0 ['capric triglyceride', 'cetyl alcohol', 'prop... £5.20 \n1 ['homosalate', 'glycerin', 'octocrylene', 'eth... £13.00 \n2 ['sodium hyaluronate', 'sodium hyaluronate', '... £6.20 \n3 ['ammonium lactate', 'c12-15', 'glycerin', 'pr... £22.50 \n4 ['glycerin', 'cetearyl alcohol', 'capric trigl... £16.00 \n... ... ... \n1133 ['prunus amygdalus dulcis', 'tipa-laureth sulf... £55.00 \n1134 ['sodium lauroyl', 'sodium cocoamphoacetate', ... £10.99 \n1135 ['prunus amygdalus dulcis', 'tipa-laureth sulf... £55.00 \n1136 ['capric triglyceride', 'peg-40 sorbitan perol... £36.00 \n1137 ['prunus amygdalus dulcis', 'sesamium indicum ... £13.95 \n\n combined_features \n0 Moisturiser ['capric triglyceride', 'cetyl alc... \n1 Moisturiser ['homosalate', 'glycerin', 'octocr... \n2 Moisturiser ['sodium hyaluronate', 'sodium hya... \n3 Moisturiser ['ammonium lactate', 'c12-15', 'gl... \n4 Moisturiser ['glycerin', 'cetearyl alcohol', '... \n... ... \n1133 Bath Oil ['prunus amygdalus dulcis', 'tipa-lau... \n1134 Bath Oil ['sodium lauroyl', 'sodium cocoamphoa... \n1135 Bath Oil ['prunus amygdalus dulcis', 'tipa-lau... \n1136 Bath Oil ['capric triglyceride', 'peg-40 sorbi... \n1137 Bath Oil ['prunus amygdalus dulcis', 'sesamium... \n\n[1138 rows x 6 columns]","text/html":"
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
product_nameproduct_urlproduct_typeclean_ingredspricecombined_features
0The Ordinary Natural Moisturising Factors + HA...https://www.lookfantastic.com/the-ordinary-nat...Moisturiser['capric triglyceride', 'cetyl alcohol', 'prop...£5.20Moisturiser ['capric triglyceride', 'cetyl alc...
1CeraVe Facial Moisturising Lotion SPF 25 52mlhttps://www.lookfantastic.com/cerave-facial-mo...Moisturiser['homosalate', 'glycerin', 'octocrylene', 'eth...£13.00Moisturiser ['homosalate', 'glycerin', 'octocr...
2The Ordinary Hyaluronic Acid 2% + B5 Hydration...https://www.lookfantastic.com/the-ordinary-hya...Moisturiser['sodium hyaluronate', 'sodium hyaluronate', '...£6.20Moisturiser ['sodium hyaluronate', 'sodium hya...
3AMELIORATE Transforming Body Lotion 200mlhttps://www.lookfantastic.com/ameliorate-trans...Moisturiser['ammonium lactate', 'c12-15', 'glycerin', 'pr...£22.50Moisturiser ['ammonium lactate', 'c12-15', 'gl...
4CeraVe Moisturising Cream 454ghttps://www.lookfantastic.com/cerave-moisturis...Moisturiser['glycerin', 'cetearyl alcohol', 'capric trigl...£16.00Moisturiser ['glycerin', 'cetearyl alcohol', '...
.....................
1133Elemis Life Elixirs Embrace Bath and Shower El...https://www.lookfantastic.com/elemis-life-elix...Bath Oil['prunus amygdalus dulcis', 'tipa-laureth sulf...£55.00Bath Oil ['prunus amygdalus dulcis', 'tipa-lau...
1134Love Boo Splendidly Soothing Bath Soak (250ml)https://www.lookfantastic.com/love-boo-splendi...Bath Oil['sodium lauroyl', 'sodium cocoamphoacetate', ...£10.99Bath Oil ['sodium lauroyl', 'sodium cocoamphoa...
1135Elemis Life Elixirs Fortitude Bath and Shower ...https://www.lookfantastic.com/elemis-life-elix...Bath Oil['prunus amygdalus dulcis', 'tipa-laureth sulf...£55.00Bath Oil ['prunus amygdalus dulcis', 'tipa-lau...
1136Connock London Kukui Oil Soothing Bath & Showe...https://www.lookfantastic.com/connock-london-k...Bath Oil['capric triglyceride', 'peg-40 sorbitan perol...£36.00Bath Oil ['capric triglyceride', 'peg-40 sorbi...
1137Weleda Baby Calendula Cream Bath (200ml)https://www.lookfantastic.com/weleda-baby-cale...Bath Oil['prunus amygdalus dulcis', 'sesamium indicum ...£13.95Bath Oil ['prunus amygdalus dulcis', 'sesamium...
\n

1138 rows × 6 columns

\n
"},"metadata":{}}],"execution_count":11},{"cell_type":"code","source":"vectorizer = TfidfVectorizer()\nX = vectorizer.fit_transform(df['combined_features'])\nX\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:53.984282Z","iopub.execute_input":"2025-05-20T14:53:53.984568Z","iopub.status.idle":"2025-05-20T14:53:54.077714Z","shell.execute_reply.started":"2025-05-20T14:53:53.984547Z","shell.execute_reply":"2025-05-20T14:53:54.076776Z"}},"outputs":[{"execution_count":12,"output_type":"execute_result","data":{"text/plain":""},"metadata":{}}],"execution_count":12},{"cell_type":"code","source":"def recommend_products(user_query, top_n=5):\n user_vec = vectorizer.transform([user_query])\n sim_scores = cosine_similarity(user_vec, X)\n top_indices = sim_scores[0].argsort()[-top_n:][::-1]\n return df.iloc[top_indices][['product_name', 'product_type', 'clean_ingreds', 'price']]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:54.078792Z","iopub.execute_input":"2025-05-20T14:53:54.079836Z","iopub.status.idle":"2025-05-20T14:53:54.084917Z","shell.execute_reply.started":"2025-05-20T14:53:54.079809Z","shell.execute_reply":"2025-05-20T14:53:54.083870Z"}},"outputs":[],"execution_count":13},{"cell_type":"code","source":"query = \"moisturizer for dry skin with hyaluronic acid\"\nrecommendations = recommend_products(query, top_n=5)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:54.085880Z","iopub.execute_input":"2025-05-20T14:53:54.086238Z","iopub.status.idle":"2025-05-20T14:53:54.111817Z","shell.execute_reply.started":"2025-05-20T14:53:54.086178Z","shell.execute_reply":"2025-05-20T14:53:54.110709Z"}},"outputs":[],"execution_count":14},{"cell_type":"code","source":"print(\"Top product recommendations for:\", query)\nprint(recommendations.to_string(index=False))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:54.112782Z","iopub.execute_input":"2025-05-20T14:53:54.113071Z","iopub.status.idle":"2025-05-20T14:53:54.122632Z","shell.execute_reply.started":"2025-05-20T14:53:54.113050Z","shell.execute_reply":"2025-05-20T14:53:54.121570Z"}},"outputs":[{"name":"stdout","text":"Top product recommendations for: moisturizer for dry skin with hyaluronic acid\n product_name product_type clean_ingreds price\n GLAMGLOW Supertoner 200ml Toner ['alcohol denat', 'propanediol', 'mandelic acid', 'glycolic acid', 'salicylic acid', 'lactic acid', 'tartaric acid', 'pyruvic acid', 'charcoal powder', 'eucalyptus globulus', 'eucalyptus globulus', 'hamamelis virginiana', 'algae extract', 'salix alba extract', 'nylon 12', 'aloe barbadenis extract', 'mentha piperita extract', 'sodium hydroxide', 'citric acid', 'parfum', 'limonene', 'linalool', 'disodium edta', 'phenoxyethanol', 'ci 77019', 'titanium dioxide', 'ci 77499'] £29.00\n La Roche-Posay Effaclar Clarifying Lotion 200ml Toner ['alcohol denat', 'glycerin', 'sodium citrate', 'propylene glycol', 'castor oil', 'disodium edta', 'capryloyl salicylic acid', 'citric acid', 'salicylic acid', 'parfum'] £12.50\n The Organic Pharmacy Four Acid Peel Serum 30ml Serum ['hamamelis virginiana', 'citrus grandis', 'passiflora quadrangularis fruit extract', 'glycerin', 'sodium lactate', 'citrus limon juice extract', 'alcohol', 'algin', 'ananas sativas fruit extract', 'vitis vinifera extract', 'dehydroacetic acid', 'benzyl alcohol', 'chondrus crispus extract', 'xanthan gum', 'potassium sorbate', 'sodium bisulfite', 'sorbic acid', 'limonene', 'citral', 'linalool', 'glycolic acid', 'lactic acid', 'citric acid', 'tartaric acid'] £30.00\n Avene Face Essentials Cleansing Foam 150ml Cleanser ['sodium cocoamphoacetate', 'sodium cocoyl glutamate', 'lactic acid', 'citric acid', 'disodium edta', 'parfum', 'glutamic acid', 'propylene glycol', 'sodium benzoate', 'sodium chloride'] £13.50\nMurad Age Reform Aha/Bha Exfoliating Cleanser (200ml) Cleanser ['sodium laureth sulfate', 'cocamidopropyl betaine', 'simmondsia chinensis leaf extract', 'acrylates copolymer', 'glycol stearate', 'butylene glycol', 'sodium pca', 'dipotassium glycyrrhizate', 'sodium ascorbyl phosphate', 'glycolic acid', 'lactic acid', 'salicylic acid', 'polyquaternium-4', 'sodium hydroxide', 'sodium chloride', 'citric acid', 'disodium edta', 'phenoxyethanol', 'methylparaben', 'propylparaben'] £38.00\n","output_type":"stream"}],"execution_count":15},{"cell_type":"code","source":"import pandas as pd\nimport spacy\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\n\n# Load spaCy English model\nnlp = spacy.load(\"en_core_web_sm\")\n\n# Custom cleaner using spaCy (group together + remove stopwords)\ndef clean_text(text):\n doc = nlp(text.lower())\n return \" \".join([token.lemma_ for token in doc if token.is_alpha and not token.is_stop])\n\n# Apply text cleaning\ndf['clean_ingreds_cleaned'] = df['clean_ingreds'].fillna('').apply(clean_text)\ndf['product_type_cleaned'] = df['product_type'].fillna('').apply(clean_text)\n\n# Give weights to ingredients (more important) vs product type\ndf['combined_features'] = df['product_type_cleaned'] + ' ' + df['clean_ingreds_cleaned'] * 2\n\n# Vectorization\nvectorizer = TfidfVectorizer()\nX = vectorizer.fit_transform(df['combined_features'])\n\n# Recommendation Function\ndef recommend_products_advanced(user_query, top_n=5):\n user_query_clean = clean_text(user_query)\n user_vec = vectorizer.transform([user_query_clean])\n sim_scores = cosine_similarity(user_vec, X)\n \n if sim_scores.max() < 0.1:\n print(\"⚠️ Warning: No strong matches found. Try using different keywords.\")\n \n top_indices = sim_scores[0].argsort()[-top_n:][::-1]\n return df.iloc[top_indices][['product_name', 'product_type', 'clean_ingreds', 'price']]\n\n# Test It\nquery = \"hydrating night cream with ceramides and niacinamide for dry skin\"\nrecommendations = recommend_products_advanced(query)\nprint(\"Recommendations for:\", query)\nprint(recommendations.to_string(index=False))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T14:53:54.123596Z","iopub.execute_input":"2025-05-20T14:53:54.123857Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def severity_score(ingredients):\n severe_terms = ['acne', 'eczema', 'rosacea', 'melasma', 'psoriasis']\n count = sum([1 for word in severe_terms if word in ingredients])\n return count","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def recommend_products_advanced(\n user_query, \n top_n=10, \n sort_by='similarity', # options: 'similarity', 'price', 'alphabetical', 'severity'\n max_price=None\n):\n user_query_clean = clean_text(user_query)\n user_vec = vectorizer.transform([user_query_clean])\n sim_scores = cosine_similarity(user_vec, X).flatten()\n\n df['similarity_score'] = sim_scores\ndf","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport spacy\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\n# Convert price to numeric, remove any non-numeric characters just in case\ndf['price'] = pd.to_numeric(df['price'], errors='coerce')\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf['price'] = pd.to_numeric(df['price'], errors='coerce') # Convert to numeric\n\n\n\n# Load spaCy NLP model\nnlp = spacy.load(\"en_core_web_sm\")\n\n# Clean input text (group together + stopword removal)\ndef clean_text(text):\n doc = nlp(str(text).lower())\n return \" \".join([token.lemma_ for token in doc if token.is_alpha and not token.is_stop])\n\n# Preprocess relevant text columns\ndf['clean_ingreds_cleaned'] = df['clean_ingreds'].fillna('').apply(clean_text)\ndf['product_type_cleaned'] = df['product_type'].fillna('').apply(clean_text)\ndf['combined_features'] = df['product_type_cleaned'] + ' ' + df['clean_ingreds_cleaned'] * 2\n\n# Vectorize\nvectorizer = TfidfVectorizer()\nX = vectorizer.fit_transform(df['combined_features'])\n\n# Define custom skin severity scoring (simple rule-based)\ndef severity_score(ingredients):\n severe_terms = ['acne', 'eczema', 'rosacea', 'melasma', 'psoriasis', 'inflammation']\n return sum([1 for word in severe_terms if word in ingredients])\n\ndf['severity_score'] = df['clean_ingreds_cleaned'].apply(severity_score)\n\n# 🧠 Enhanced Recommendation Function\ndef recommend_products_advanced(\n user_query,\n top_n=10,\n sort_by='similarity', # Options: similarity, price, alphabetical, severity\n max_price=None\n):\n # Clean the user input\n user_query_clean = clean_text(user_query)\n user_vec = vectorizer.transform([user_query_clean])\n sim_scores = cosine_similarity(user_vec, X).flatten()\n\n # Attach similarity scores\n df['similarity_score'] = sim_scores\n\n # Apply price filtering if specified\n if max_price is not None:\n filtered_df = df[df['price'] <= max_price]\n else:\n filtered_df = df.copy()\n\n # Sorting options\n if sort_by == 'similarity':\n sorted_df = filtered_df.sort_values(by='similarity_score', ascending=False)\n elif sort_by == 'price':\n sorted_df = filtered_df.sort_values(by='price', ascending=True)\n elif sort_by == 'alphabetical':\n sorted_df = filtered_df.sort_values(by='product_name')\n elif sort_by == 'severity':\n sorted_df = filtered_df.sort_values(by='severity_score', ascending=False)\n else:\n sorted_df = filtered_df\n\n return sorted_df[['product_name', 'product_type', 'clean_ingreds', 'price', 'similarity_score']].head(top_n)\n\n# 🔍 Example usage\nquery = \"hydrating cream for acne with niacinamide\"\nrecommendations = recommend_products_advanced(query, top_n=5, sort_by='price', max_price=2500)\n\nprint(\"🔎 Top Matches For:\", query)\nprint(recommendations.to_string(index=False))\nrecommend_products_advanced(query, top_n=5, sort_by='price', max_price=2500)\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\n# Load your dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf['price'] = pd.to_numeric(df['price'], errors='coerce')\n\n# (Reapply text cleaning function and other prep if not already run)\nimport spacy\nnlp = spacy.load(\"en_core_web_sm\")\n\ndef clean_text(text):\n doc = nlp(str(text).lower())\n return \" \".join([token.lemma_ for token in doc if token.is_alpha and not token.is_stop])\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Create combined cleaned text\ndf['combined_text'] = (df['product_type'].fillna('') + ' ' + df['clean_ingreds'].fillna('')) * 2\ndf['combined_text_cleaned'] = df['combined_text'].apply(clean_text)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sentence_transformers import SentenceTransformer, util\n\n# Load pre-trained Sentence-BERT model\nsbert_model = SentenceTransformer('all-MiniLM-L6-v2') # Lightweight & effective\n\n# Compute sentence embeddings for product descriptions\ndf['combined_text'] = (df['product_type'].fillna('') + ' ' + df['clean_ingreds'].fillna('')) * 2\ndf['combined_text_cleaned'] = df['combined_text'].apply(clean_text)\nproduct_embeddings = sbert_model.encode(df['combined_text_cleaned'].tolist(), convert_to_tensor=True)\n\n# Enhanced Recommendation Function using SBERT\ndef recommend_with_embeddings(\n user_query,\n top_n=10,\n sort_by='semantic', # New default\n max_price=None\n):\n user_query_cleaned = clean_text(user_query)\n query_embedding = sbert_model.encode(user_query_cleaned, convert_to_tensor=True)\n \n # Semantic similarity\n cosine_scores = util.pytorch_cos_sim(query_embedding, product_embeddings)[0]\n\n df['semantic_score'] = cosine_scores.cpu().numpy()\n\n # Apply price filter\n if max_price is not None:\n filtered_df = df[df['price'] <= max_price]\n else:\n filtered_df = df.copy()\n\n # Sorting\n if sort_by == 'semantic':\n sorted_df = filtered_df.sort_values(by='semantic_score', ascending=False)\n elif sort_by == 'price':\n sorted_df = filtered_df.sort_values(by='price', ascending=True)\n elif sort_by == 'severity':\n sorted_df = filtered_df.sort_values(by='severity_score', ascending=False)\n elif sort_by == 'alphabetical':\n sorted_df = filtered_df.sort_values(by='product_name')\n else:\n sorted_df = filtered_df\n\n return sorted_df[['product_name', 'product_type', 'clean_ingreds', 'price', 'semantic_score']].head(top_n)\n\n# 🔍 Example Usage\nquery = \"hydrating cream for acne with niacinamide\"\nrecommendations = recommend_with_embeddings(query, top_n=5, sort_by='semantic', max_price=2500)\n\nprint(\"🔎 Semantic Top Matches For:\", query)\nprint(recommendations.to_string(index=False))\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport spacy\nfrom sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf['price'] = pd.to_numeric(df['price'], errors='coerce')\n\n# Load spaCy NLP model\nnlp = spacy.load(\"en_core_web_sm\")\n\n# Clean input text (group together + stopword removal)\ndef clean_text(text):\n doc = nlp(str(text).lower())\n return \" \".join([token.lemma_ for token in doc if token.is_alpha and not token.is_stop])\n\n# Preprocess relevant text columns\ndf['clean_ingreds_cleaned'] = df['clean_ingreds'].fillna('').apply(clean_text)\ndf['product_type_cleaned'] = df['product_type'].fillna('').apply(clean_text)\ndf['combined_features'] = df['product_type_cleaned'] + ' ' + df['clean_ingreds_cleaned'] * 2\n\n# Severity scoring\ndef severity_score(ingredients):\n severe_terms = ['acne', 'eczema', 'rosacea', 'melasma', 'psoriasis', 'inflammation']\n return sum([1 for word in severe_terms if word in ingredients])\n\ndf['severity_score'] = df['clean_ingreds_cleaned'].apply(severity_score)\n\n# Ingredient presence matrix\ningred_vectorizer = CountVectorizer(binary=True, max_features=100)\ningred_matrix = ingred_vectorizer.fit_transform(df['clean_ingreds_cleaned'])\ningred_df = pd.DataFrame(ingred_matrix.toarray(), columns=ingred_vectorizer.get_feature_names_out())\n\n# Combine features\ndf_model = pd.concat([df.reset_index(drop=True), ingred_df], axis=1)\nfeature_cols = ingred_vectorizer.get_feature_names_out().tolist() + ['price', 'severity_score']\n\n# Simulate training labels (relevance) using cosine similarity from TF-IDF\ntfidf = TfidfVectorizer()\nX_tfidf = tfidf.fit_transform(df['combined_features'])\n\ndef recommend_products_tree_model(\n user_query,\n top_n=10,\n max_price=None,\n sort_by='model' # Can also use 'price' or 'severity'\n):\n # Clean and transform query\n user_query_clean = clean_text(user_query)\n user_query_vec = tfidf.transform([user_query_clean])\n \n # Simulated relevance as label\n df_model['sim_label'] = cosine_similarity(user_query_vec, X_tfidf).flatten()\n\n # Train a Random Forest model on current query\n X = df_model[feature_cols].fillna(0)\n y = df_model['sim_label']\n model = RandomForestRegressor(n_estimators=100, random_state=42)\n model.fit(X, y)\n\n # Predict relevance\n df_model['predicted_relevance'] = model.predict(X)\n\n # Filter by price if needed\n if max_price is not None:\n filtered_df = df_model[df_model['price'] <= max_price]\n else:\n filtered_df = df_model\n\n # Sorting\n if sort_by == 'model':\n sorted_df = filtered_df.sort_values(by='predicted_relevance', ascending=False)\n elif sort_by == 'price':\n sorted_df = filtered_df.sort_values(by='price', ascending=True)\n elif sort_by == 'severity':\n sorted_df = filtered_df.sort_values(by='severity_score', ascending=False)\n else:\n sorted_df = filtered_df\n\n return sorted_df[['product_name', 'product_type', 'clean_ingreds', 'price', 'predicted_relevance']].head(top_n)\n\n# 🔍 Example usage\nquery = \"hydrating cream for acne with niacinamide\"\nrecommendations = recommend_products_tree_model(query, top_n=5, max_price=2500, sort_by='model')\n\nprint(\"🔎 Tree Model Top Matches For:\", query)\nprint(recommendations.to_string(index=False))\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport spacy\nfrom sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Load dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf['price'] = pd.to_numeric(df['price'], errors='coerce')\n\n# Load spaCy model\nnlp = spacy.load(\"en_core_web_sm\")\n\n# Text cleaning function\ndef clean_text(text):\n doc = nlp(str(text).lower())\n return \" \".join([token.lemma_ for token in doc if token.is_alpha and not token.is_stop])\n\n# Apply cleaning\ndf['clean_ingreds_cleaned'] = df['clean_ingreds'].fillna('').apply(clean_text)\ndf['product_type_cleaned'] = df['product_type'].fillna('').apply(clean_text)\ndf['combined_features'] = df['product_type_cleaned'] + ' ' + df['clean_ingreds_cleaned'] * 2\n\n# Severity score\ndef severity_score(ingredients):\n severe_terms = ['acne', 'eczema', 'rosacea', 'melasma', 'psoriasis', 'inflammation']\n return sum([1 for word in severe_terms if word in ingredients])\n\ndf['severity_score'] = df['clean_ingreds_cleaned'].apply(severity_score)\n\n# Ingredient features (binary)\ningred_vectorizer = CountVectorizer(binary=True, max_features=100)\ningred_matrix = ingred_vectorizer.fit_transform(df['clean_ingreds_cleaned'])\ningred_df = pd.DataFrame(ingred_matrix.toarray(), columns=ingred_vectorizer.get_feature_names_out())\n\n# Combine features\ndf_model = pd.concat([df.reset_index(drop=True), ingred_df], axis=1)\nfeature_cols = ingred_vectorizer.get_feature_names_out().tolist() + ['price', 'severity_score']\n\n# TF-IDF for simulated relevance (proxy labels)\ntfidf = TfidfVectorizer()\nX_tfidf = tfidf.fit_transform(df['combined_features'])\n\n# User-Controlled Recommendation Function\ndef recommend_user_controlled():\n # 🌟 Get user input\n print(\"Enter your skincare query (e.g., 'moisturizer for acne with salicylic acid'):\")\n user_query = input(\"Query: \")\n \n try:\n top_n = int(input(\"How many recommendations do you want? (default 5): \") or 5)\n except:\n top_n = 5\n\n try:\n max_price = float(input(\"Enter max price (or press enter to skip): \") or float('inf'))\n except:\n max_price = float('inf')\n\n sort_by = input(\"Sort by (model / price / severity)? (default = model): \").strip().lower() or 'model'\n\n # ✅ Preprocess query\n user_query_clean = clean_text(user_query)\n user_vec = tfidf.transform([user_query_clean])\n\n # Simulated labels for tree model training\n df_model['sim_label'] = cosine_similarity(user_vec, X_tfidf).flatten()\n X = df_model[feature_cols].fillna(0)\n y = df_model['sim_label']\n\n # Train model\n model = RandomForestRegressor(n_estimators=100, random_state=42)\n model.fit(X, y)\n\n # Predict relevance\n df_model['predicted_relevance'] = model.predict(X)\n\n # Filter and sort\n filtered_df = df_model[df_model['price'] <= max_price]\n\n if sort_by == 'model':\n sorted_df = filtered_df.sort_values(by='predicted_relevance', ascending=False)\n elif sort_by == 'price':\n sorted_df = filtered_df.sort_values(by='price', ascending=True)\n elif sort_by == 'severity':\n sorted_df = filtered_df.sort_values(by='severity_score', ascending=False)\n else:\n sorted_df = filtered_df\n\n # Display results\n results = sorted_df[['product_name', 'product_type', 'clean_ingreds', 'price', 'predicted_relevance']].head(top_n)\n print(\"\\n🔍 Top Recommendations:\")\n print(results.to_string(index=False))\n\n# ✅ Run the user-controlled recommender\nrecommend_user_controlled()\ndef recommend_user_controlled():\n # 🌟 Get user input\n print(\"Enter your skincare query (e.g., 'moisturizer for acne with salicylic acid'):\")\n user_query = input(\"Query: \")\n \n try:\n top_n = int(input(\"How many recommendations do you want? (default 5): \") or 5)\n except:\n top_n = 5\n\n try:\n max_price_input = input(\"Enter max price (or press enter to skip): \")\n max_price = float(max_price_input) if max_price_input else float('inf')\n except:\n max_price = float('inf')\n\n sort_by = input(\"Sort by (model / price / severity)? (default = model): \").strip().lower()\n if sort_by not in ['model', 'price', 'severity']:\n print(f\"⚠️ Invalid sort option '{sort_by}', defaulting to 'model'.\")\n sort_by = 'model'\n\n # ✅ Preprocess query\n user_query_clean = clean_text(user_query)\n user_vec = tfidf.transform([user_query_clean])\n\n # Simulated labels for tree model training\n df_model['sim_label'] = cosine_similarity(user_vec, X_tfidf).flatten()\n X = df_model[feature_cols].fillna(0)\n y = df_model['sim_label']\n\n # Train model\n model = RandomForestRegressor(n_estimators=100, random_state=42)\n model.fit(X, y)\n\n # Predict relevance\n df_model['predicted_relevance'] = model.predict(X)\n\n # Filter and check\n filtered_df = df_model[df_model['price'] <= max_price]\n print(f\"\\n🔎 Found {len(filtered_df)} products under price {max_price} for query: '{user_query}'\")\n\n if filtered_df.empty:\n print(\"⚠️ No matching products. Try increasing price or changing the query.\")\n return\n\n # Sort\n if sort_by == 'model':\n sorted_df = filtered_df.sort_values(by='predicted_relevance', ascending=False)\n elif sort_by == 'price':\n sorted_df = filtered_df.sort_values(by='price', ascending=True)\n elif sort_by == 'severity':\n sorted_df = filtered_df.sort_values(by='severity_score', ascending=False)\n\n # Show result\n results = sorted_df[['product_name', 'product_type', 'clean_ingreds', 'price', 'predicted_relevance']].head(top_n)\n print(\"\\n✅ Top Recommendations:\")\n print(results.to_string(index=False))\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\n# Load data\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\n\n# Clean the price column\ndf['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n\n# User inputs\nquery = \"acne\"\nnum_results = 1\nmax_price = 200\nsort_by = \"price\" # could also be \"model\" or \"severity\"\n\n# Define acne-related ingredients\nacne_ingreds = [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"]\npattern = '|'.join(acne_ingreds)\n\n# Filter products containing those ingredients\nfiltered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n\n# Apply price filter\nif max_price:\n filtered = filtered[filtered['price'] <= max_price]\n\n# Sort by user-specified field\nif sort_by in filtered.columns:\n filtered = filtered.sort_values(by=sort_by)\nelse:\n filtered = filtered.sort_values(by='price') # fallback\n\n# Select top results\ntop_recommendations = filtered.head(num_results)[['product_name', 'product_type', 'clean_ingreds', 'price']]\n\n# Display results\nprint(\"🔍 Top Recommendations:\")\nprint(top_recommendations.to_string(index=False))\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\ndef get_skincare_recommendations(filepath):\n # Load and clean data\n df = pd.read_csv(filepath)\n df['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n\n # --- USER INPUT SECTION ---\n concern = input(\"Enter your skincare concern (e.g., 'acne', 'dryness', 'aging', etc.): \").strip().lower()\n \n try:\n num_results = int(input(\"How many recommendations do you want? (default 5): \") or 5)\n except ValueError:\n num_results = 5\n\n try:\n max_price_input = input(\"Enter max price (or press enter to skip): \").strip()\n max_price = float(max_price_input) if max_price_input else None\n except ValueError:\n max_price = None\n\n sort_by = input(\"Sort by (price / product_name / product_type)? (default = price): \").strip().lower() or \"price\"\n\n # Ingredient filters for common concerns\n concern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n }\n\n # Select ingredients for concern or fallback to raw keyword\n ingredients = concern_ingredients.get(concern, [concern])\n pattern = '|'.join(ingredients)\n\n # Filter by ingredients\n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n\n # Apply price filter\n if max_price is not None:\n filtered = filtered[filtered['price'] <= max_price]\n\n # Sort and get top results\n if sort_by in filtered.columns:\n filtered = filtered.sort_values(by=sort_by)\n else:\n filtered = filtered.sort_values(by=\"price\")\n\n top_recommendations = filtered.head(num_results)[['product_name', 'product_type', 'clean_ingreds', 'price']]\n\n # Display results\n if top_recommendations.empty:\n print(\"\\n❌ No matching products found based on your criteria.\")\n else:\n print(\"\\n🔍 Top Recommendations:\")\n# Truncate ingredients for cleaner display\ntop_recommendations['clean_ingreds'] = top_recommendations['clean_ingreds'].apply(\n lambda x: ', '.join(eval(x)[:3]) + \"...\" if isinstance(x, str) and x.startswith('[') else x\n)\n\n# Round price for neatness\ntop_recommendations['price'] = top_recommendations['price'].round(2)\n\n# Clean print\nprint(\"\\n🔍 Top Recommendations:\\n\")\nfor i, row in top_recommendations.iterrows():\n print(f\"🧴 Product: {row['product_name']}\")\n print(f\"📦 Type : {row['product_type']}\")\n print(f\"🧪 Key Ingredients: {row['clean_ingreds']}\")\n print(f\"💰 Price : £{row['price']}\\n\")\n\n\n# --- RUN THE FUNCTION ---\nget_skincare_recommendations(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T16:08:39.506592Z","iopub.execute_input":"2025-05-20T16:08:39.506935Z","iopub.status.idle":"2025-05-20T16:08:39.525346Z","shell.execute_reply.started":"2025-05-20T16:08:39.506904Z","shell.execute_reply":"2025-05-20T16:08:39.523686Z"}},"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)","\u001b[0;32m/tmp/ipykernel_31/392685437.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"\\n🔍 Top Recommendations:\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[0;31m# Truncate ingredients for cleaner display\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 58\u001b[0;31m top_recommendations['clean_ingreds'] = top_recommendations['clean_ingreds'].apply(\n\u001b[0m\u001b[1;32m 59\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m', '\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0meval\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"...\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstartswith\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'['\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m )\n","\u001b[0;31mNameError\u001b[0m: name 'top_recommendations' is not defined"],"ename":"NameError","evalue":"name 'top_recommendations' is not defined","output_type":"error"}],"execution_count":9},{"cell_type":"code","source":"import pandas as pd\n\ndef get_skincare_recommendations(filepath):\n # Load and clean data\n df = pd.read_csv(filepath)\n df['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n\n concern = input(\"Enter your skincare concern (e.g., 'acne', 'dryness', 'aging', etc.): \").strip().lower()\n \n try:\n num_results = int(input(\"How many recommendations do you want? (default 5): \") or 5)\n except ValueError:\n num_results = 5\n\n try:\n max_price_input = input(\"Enter max price (or press enter to skip): \").strip()\n max_price = float(max_price_input) if max_price_input else None\n except ValueError:\n max_price = None\n\n sort_by = input(\"Sort by (price / product_name / product_type)? (default = price): \").strip().lower() or \"price\"\n\n concern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n }\n\n ingredients = concern_ingredients.get(concern, [concern])\n pattern = '|'.join(ingredients)\n\n # Filter 1: by ingredients\n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n\n # Filter 2: by price\n if max_price is not None:\n filtered = filtered[filtered['price'] <= max_price]\n\n # --- Fallbacks ---\n if filtered.empty:\n print(\"\\n⚠️ No results for both concern and price filters.\")\n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n if not filtered.empty:\n print(\"✅ Showing results based on concern only (price filter dropped).\")\n else:\n print(\"⚠️ No matches for concern either. Showing top overall products.\")\n filtered = df.copy()\n\n # Sort and format\n if sort_by in filtered.columns:\n filtered = filtered.sort_values(by=sort_by)\n else:\n filtered = filtered.sort_values(by=\"price\")\n\n # Clean display\n filtered['clean_ingreds'] = filtered['clean_ingreds'].apply(\n lambda x: ', '.join(eval(x)[:3]) + \"...\" if isinstance(x, str) and x.startswith('[') else x\n )\n filtered['price'] = filtered['price'].round(2)\n\n top_recommendations = filtered.head(num_results)\n\n # Display\n print(\"\\n🔍 Top Recommendations:\\n\")\n for _, row in top_recommendations.iterrows():\n print(f\"🧴 Product: {row['product_name']}\")\n print(f\"📦 Type : {row['product_type']}\")\n print(f\"🧪 Key Ingredients: {row['clean_ingreds']}\")\n print(f\"💰 Price : £{row['price']}\\n\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-20T16:08:44.974340Z","iopub.execute_input":"2025-05-20T16:08:44.974675Z","iopub.status.idle":"2025-05-20T16:08:44.987219Z","shell.execute_reply.started":"2025-05-20T16:08:44.974651Z","shell.execute_reply":"2025-05-20T16:08:44.985939Z"}},"outputs":[],"execution_count":10},{"cell_type":"code","source":"import pandas as pd\n\ndef get_skincare_recommendations(filepath):\n # Load and clean data\n df = pd.read_csv(filepath)\n df['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n\n concern = input(\"Enter your skincare concern (e.g., 'acne', 'dryness', 'aging', etc.): \").strip().lower()\n \n try:\n num_results = int(input(\"How many recommendations do you want? (default 5): \") or 5)\n except ValueError:\n num_results = 5\n\n try:\n max_price_input = input(\"Enter max price (or press enter to skip): \").strip()\n max_price = float(max_price_input) if max_price_input else None\n except ValueError:\n max_price = None\n\n sort_by = input(\"Sort by (price / product_name / product_type)? (default = price): \").strip().lower() or \"price\"\n\n concern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n }\n\n ingredients = concern_ingredients.get(concern, [concern])\n pattern = '|'.join(ingredients)\n\n # Filter 1: by ingredients\n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n\n # Filter 2: by price\n if max_price is not None:\n filtered = filtered[filtered['price'] <= max_price]\n\n # --- Fallbacks ---\n if filtered.empty:\n print(\"\\n⚠️ No results for both concern and price filters.\")\n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n if not filtered.empty:\n print(\"✅ Showing results based on concern only (price filter dropped).\")\n else:\n print(\"⚠️ No matches for concern either. Showing top overall products.\")\n filtered = df.copy()\n\n # Sort and format\n if sort_by in filtered.columns:\n filtered = filtered.sort_values(by=sort_by)\n else:\n filtered = filtered.sort_values(by=\"price\")\n\n # Clean display\n filtered['clean_ingreds'] = filtered['clean_ingreds'].apply(\n lambda x: ', '.join(eval(x)[:3]) + \"...\" if isinstance(x, str) and x.startswith('[') else x\n )\n filtered['price'] = filtered['price'].round(2)\n\n top_recommendations = filtered.head(num_results)\n\n # Display\n print(\"\\n🔍 Top Recommendations:\\n\")\n for _, row in top_recommendations.iterrows():\n print(f\"🧴 Product: {row['product_name']}\")\n print(f\"📦 Type : {row['product_type']}\")\n print(f\"🧪 Key Ingredients: {row['clean_ingreds']}\")\n print(f\"💰 Price : £{row['price']}\\n\")\nif __name__ == \"__main__\":\n get_skincare_recommendations(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-21T04:29:19.989834Z","iopub.execute_input":"2025-05-21T04:29:19.990570Z","iopub.status.idle":"2025-05-21T04:30:20.396297Z","shell.execute_reply.started":"2025-05-21T04:29:19.990547Z","shell.execute_reply":"2025-05-21T04:30:20.395356Z"}},"outputs":[{"output_type":"stream","name":"stdin","text":"Enter your skincare concern (e.g., 'acne', 'dryness', 'aging', etc.): blackheads\nHow many recommendations do you want? (default 5): 3\nEnter max price (or press enter to skip): 200\nSort by (price / product_name / product_type)? (default = price): product_type\n"},{"name":"stdout","text":"\n⚠️ No results for both concern and price filters.\n⚠️ No matches for concern either. Showing top overall products.\n\n🔍 Top Recommendations:\n\n🧴 Product: Uriage Xémose Anti-Itch Soothing Oil Balm 500ml\n📦 Type : Balm\n🧪 Key Ingredients: c13-15 alkane, hydrogenated polydecene, butyrospermum parkii...\n💰 Price : £20.89\n\n🧴 Product: NUXE Baume Levres Reve De Miel - Honey Lip Balm (15g)\n📦 Type : Balm\n🧪 Key Ingredients: cera alba, butyrospermum parkii, olus oil...\n💰 Price : £10.0\n\n🧴 Product: La Roche-Posay Cicaplast Baume B5 Soothing Repairing Balm 40ml\n📦 Type : Balm\n🧪 Key Ingredients: hydrogenated polyisobutene, dimethicon, glycerin...\n💰 Price : £7.5\n\n","output_type":"stream"}],"execution_count":2},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.metrics import multilabel_confusion_matrix\nfrom sklearn.preprocessing import MultiLabelBinarizer\n\ndef evaluate_recommendation_accuracy(filepath):\n df = pd.read_csv(filepath)\n df['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n \n # Assumed ground truth column: comma-separated concerns\n df = df.dropna(subset=['clean_ingreds', 'concerns'])\n df['true_concerns'] = df['concerns'].str.lower().str.split(',\\s*')\n\n concern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n }\n\n # Predict concerns based on ingredient matching\n def predict_concerns(ingredients):\n ingredients = ingredients.lower()\n predicted = []\n for concern, keywords in concern_ingredients.items():\n if any(keyword in ingredients for keyword in keywords):\n predicted.append(concern)\n return predicted\n\n df['pred_concerns'] = df['clean_ingreds'].str.lower().apply(predict_concerns)\n\n # Binarize true and predicted labels\n mlb = MultiLabelBinarizer(classes=list(concern_ingredients.keys()))\n y_true = mlb.fit_transform(df['true_concerns'])\n y_pred = mlb.transform(df['pred_concerns'])\n\n # Compute confusion matrices for each label\n matrices = multilabel_confusion_matrix(y_true, y_pred, labels=mlb.classes_)\n\n results = {}\n for idx, label in enumerate(mlb.classes_):\n tn, fp, fn, tp = matrices[idx].ravel()\n accuracy = (tp + tn) / (tp + tn + fp + fn)\n precision = tp / (tp + fp) if (tp + fp) > 0 else 0\n recall = tp / (tp + fn) if (tp + fn) > 0 else 0\n f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0\n results[label] = {\n \"Accuracy\": round(accuracy, 3),\n \"Precision\": round(precision, 3),\n \"Recall\": round(recall, 3),\n \"F1 Score\": round(f1, 3),\n \"TP\": int(tp), \"FP\": int(fp), \"FN\": int(fn), \"TN\": int(tn)\n }\n\n return pd.DataFrame(results).T.sort_values(by=\"F1 Score\", ascending=False)\n","metadata":{"trusted":true},"outputs":[],"execution_count":2},{"cell_type":"code","source":"import pandas as pd\n\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\nprint(df.columns.tolist())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T13:56:41.083576Z","iopub.execute_input":"2025-05-25T13:56:41.083911Z","iopub.status.idle":"2025-05-25T13:56:41.110543Z","shell.execute_reply.started":"2025-05-25T13:56:41.083885Z","shell.execute_reply":"2025-05-25T13:56:41.109470Z"}},"outputs":[{"name":"stdout","text":"['product_name', 'product_url', 'product_type', 'clean_ingreds', 'price']\n","output_type":"stream"}],"execution_count":9},{"cell_type":"code","source":"import pandas as pd\n\nfilepath = \"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\"\ndf = pd.read_csv(filepath)\n\nconcern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n}\n\ndef predict_concerns(ingredients):\n ingredients = ingredients.lower()\n predicted = []\n for concern, keywords in concern_ingredients.items():\n if any(keyword in ingredients for keyword in keywords):\n predicted.append(concern)\n return predicted\n\ndf = df.dropna(subset=['clean_ingreds'])\ndf['predicted_concerns'] = df['clean_ingreds'].apply(predict_concerns)\n\n# Preview\nprint(df[['product_name', 'predicted_concerns']].head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T13:59:15.950678Z","iopub.execute_input":"2025-05-25T13:59:15.951039Z","iopub.status.idle":"2025-05-25T13:59:16.009504Z","shell.execute_reply.started":"2025-05-25T13:59:15.951015Z","shell.execute_reply":"2025-05-25T13:59:16.008641Z"}},"outputs":[{"name":"stdout","text":" product_name \\\n0 The Ordinary Natural Moisturising Factors + HA... \n1 CeraVe Facial Moisturising Lotion SPF 25 52ml \n2 The Ordinary Hyaluronic Acid 2% + B5 Hydration... \n3 AMELIORATE Transforming Body Lotion 200ml \n4 CeraVe Moisturising Cream 454g \n\n predicted_concerns \n0 [dryness, sensitivity] \n1 [acne, dryness, aging, pigmentation] \n2 [dryness, sensitivity] \n3 [dryness, sensitivity] \n4 [dryness] \n","output_type":"stream"}],"execution_count":10},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.metrics import multilabel_confusion_matrix\nfrom sklearn.preprocessing import MultiLabelBinarizer\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\n\n# Load your dataset\ndf = pd.read_csv(\"/kaggle/input/skincare-products-clean-dataset/skincare_products_clean.csv\")\ndf = df.dropna(subset=['clean_ingreds'])\n\n# Define concern-to-ingredient mapping\nconcern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n}\nall_concerns = list(concern_ingredients.keys())\n\n# Predict concerns based on ingredients\ndef predict_concerns(ingredients):\n ingredients = ingredients.lower()\n predicted = []\n for concern, keywords in concern_ingredients.items():\n if any(keyword in ingredients for keyword in keywords):\n predicted.append(concern)\n return predicted\n\ndf['pred_concerns'] = df['clean_ingreds'].apply(predict_concerns)\n\n# Fake true concerns based on prediction + noise\ndef fake_true_concerns(predicted):\n base = set(predicted)\n # Add or remove 1 concern with some probability to simulate imperfect ground truth\n if random.random() < 0.3 and base:\n base.remove(random.choice(list(base)))\n if random.random() < 0.4:\n base.add(random.choice(all_concerns))\n return list(base)\n\ndf['true_concerns'] = df['pred_concerns'].apply(fake_true_concerns)\n\n# Binarize labels\nmlb = MultiLabelBinarizer(classes=all_concerns)\ny_true = mlb.fit_transform(df['true_concerns'])\ny_pred = mlb.transform(df['pred_concerns'])\n\n# Compute multilabel confusion matrices WITHOUT 'labels' param (fix!)\nmatrices = multilabel_confusion_matrix(y_true, y_pred)\n\n# Plotting function\ndef plot_multilabel_confusion_matrices(matrices, labels):\n for idx, label in enumerate(labels):\n tn, fp, fn, tp = matrices[idx].ravel()\n cm = [[tp, fn],\n [fp, tn]]\n\n plt.figure(figsize=(4, 3))\n sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Purples\", cbar=False,\n xticklabels=['Actual Positive', 'Actual Negative'],\n yticklabels=['Predicted Positive', 'Predicted Negative'])\n plt.title(f'Confusion Matrix for \"{label}\"')\n plt.xlabel(\"Actual\")\n plt.ylabel(\"Predicted\")\n plt.tight_layout()\n plt.show()\n\n# Run the plot\nplot_multilabel_confusion_matrices(matrices, mlb.classes_)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-25T14:12:45.285450Z","iopub.execute_input":"2025-05-25T14:12:45.285764Z","iopub.status.idle":"2025-05-25T14:12:45.934731Z","shell.execute_reply.started":"2025-05-25T14:12:45.285742Z","shell.execute_reply":"2025-05-25T14:12:45.933933Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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no3jxo2n77B37YokJuYw165dZd++XQQFDcfdvTENGjx9Q2BtXY4qVappPQDs7OypUMGheE7qDZeVlcUff0TQvl0HrdEYlUqFv19fVv66gm3btpKQkMD3P8zj4sULdOrYuRgjfvOViB5TQZUpU4bdu3cTFBRE586defDgARUrVsTT01PTgxo9ejSJiYn4+fmhp6dHv3796NSpE8nJyXm2u2DBAsaPH8+QIUNISkqicuXKjB8/HoCKFSsyadIkxo4dS9++fenTpw9Lly7l66+/xtbWlpCQEM6fP4+VlRX169fX7Fe5cmXWrVvHyJEjmTdvHg0bNmTq1Kn069fvpc5/y5YtjBgxgvfee48yZcrQpUsXZs2apdl+5swZwsLCSEpKokKFCnz66ad88sknubY3YMAAoqKiaNCgASkpKezcuTPPXo+vry9DhgyhT58+WsOfKpWKTZs28cUXX9C3b19u3bqFvb09jRs3pnz58oU+V10TG3uawMAhmuehobMBaNmyLZ9//hV37twmNHQ2d+/ewdrahhYtWtOrV0AxRSsA/joQTeL1RDp27JRjWy/f3qSmpjJj5nSSk+/jUrMmoQt+wtGxcjFEWnqolLxm+4XQQZcv3yvuEMQL2JYz/fdKotgYlzEs7hDy5Y0cyhNCCFFySWISQgihUyQxCSGE0CmSmIQQQugUSUxCCCF0iiQmIYQQOkUSkxBCCJ0iiUkIIYROkcQkhBBCp0hiEkIIoVMkMQkhhNApkpiEEELoFElMQgghdIokJiGEEDpFEpMQQgidIolJCCGETpHEJIQQQqfk+6fV79+/n+9Gs3++XAghhCiofCcmKysrVCpVvupmZmYWOiAhhBClW74T086dOzX/vnjxImPHjsXf359GjRoBEB0dTVhYGCEhIUUfpRBCiFJDpSiKUtCdPD096d+/Pz169NAqDw8P58cffyQqKqqo4hNCy+XL94o7BPECtuVMizsE8QLGZQyLO4R8KdTih+joaBo0aJCjvEGDBhw8ePClgxJCCFF6FSoxOTo68tNPP+UoX7RoEY6Oji8dlBBCiNIr33NMz/ruu+/o0qULmzdv5v333wfg4MGDxMfHs27duiINUAghROlSqDkmgMuXL7NgwQLOnDkDgKurK4MGDZIek3ilZI5Jt8kck24rKXNMhU5MQhQHSUy6TRKTbispianQ3/ywZ88e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\n"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"
","image/png":"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0tLSAJ7rPXuZSDITemv16tXUqlULV1dXevXqxdKlS3n8kyabNm2iQ4cOtGrVij/++IOdO3dSv359AH766Sdee+01pkyZQkpKCikpKQU+7t27d/H39yc2NpbffvuNGjVq0KpVK+7evftM52NmZkZmZibwcNjr999/Z/369Rw8eBBFUWjVqhVZWVkADBkyhIyMDPbu3cvJkyeZMWMGFhYWudr08vJizpw5WFlZac9zzJgxuer17NmTDRs2aF9QAbZu3cr9+/e1CSckJITly5cTFhbGX3/9xciRI+nVqxd79uwB9P9+GBoaMn36dObPn8+///6bZ53z58/j6+tLx44dOXHiBKtWrSI2NpahQ4dq6/Tp04dLly4RExPDunXr+Pbbb7l69apOOwYGBsybN4+//vqLyMhIdu3axaeffgo833v2UlGE0FNeXl7KnDlzFEVRlKysLMXW1lbZvXu3drunp6fSs2fPfPd3cnJSvv76a52ySZMmKXXq1NEp+/rrrxUnJ6d828nJyVEsLS2VDRs2aMsA5eeff853H39/f6Vdu3aKoiiKRqNRtm/frqjVamXMmDHK2bNnFUDZv3+/tv7169cVMzMzZfXq1YqiKIq7u7sSHBycZ9u7d+9WAOXWrVuKoihKRESEYm1tnave4+f/6PotX75cu7179+5K165dFUVRlPT0dKVMmTLKgQMHdNoIDAxUunfvrijKy3M/3nvvPeWjjz5SFEVRfv75Z+Xxl8nAwEBlwIABOvvu27dPMTAwUB48eKCcPn1aAZQjR45otyckJChArnN73Jo1a5Ty5ctrHz+ve/YykZ6Z0Evx8fEcPnyY7t27A2BkZETXrl0JDw/X1jl+/DhNmzYt9mNfuXKF/v37U6NGDaytrbGysiItLY3k5ORCtbNx40YsLCwwNTWlZcuWdO3aleDgYE6fPo2RkRHvvvuutm758uVxdXXl9OnTAAwfPpz//e9/NGjQgEmTJnHixIlnOicjIyO6dOnCypUrAbh37x6//PILPXv2BODcuXPcv3+fZs2aYWFhof1Zvnw558+ffynuxyMzZswgMjJSe60fFxcXx7Jly3SuQYsWLdBoNFy4cIH4+HiMjIyoW7eudh8XFxfKli2r086OHTto2rQplStXxtLSkt69e3Pjxg3u379f4Dif9Z69bIxKOwAhiiI8PJzs7GwcHBy0ZYqi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\n"},"metadata":{}}],"execution_count":13},{"cell_type":"code","source":"import os\n\n# ✅ Suppress TensorFlow & XLA logging\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 0 = all logs, 3 = only errors\nos.environ[\"TF_XLA_FLAGS\"] = \"--tf_xla_enable_xla_devices=false\"\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:27:22.775172Z","iopub.execute_input":"2025-05-26T06:27:22.775479Z","iopub.status.idle":"2025-05-26T06:27:22.781402Z","shell.execute_reply.started":"2025-05-26T06:27:22.775457Z","shell.execute_reply":"2025-05-26T06:27:22.780105Z"}},"outputs":[],"execution_count":3},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.preprocessing import image\nfrom tensorflow.keras.applications.mobilenet_v2 import MobileNetV2, preprocess_input, decode_predictions\nimport numpy as np\nimport requests\nfrom PIL import Image\nfrom io import BytesIO\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:27:38.051416Z","iopub.execute_input":"2025-05-26T06:27:38.052854Z","iopub.status.idle":"2025-05-26T06:27:38.065761Z","shell.execute_reply.started":"2025-05-26T06:27:38.052816Z","shell.execute_reply":"2025-05-26T06:27:38.064510Z"}},"outputs":[],"execution_count":4},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n\ndef build_model(input_shape=(128, 128, 3), num_classes=2):\n model = Sequential([\n Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),\n MaxPooling2D(2, 2),\n Conv2D(64, (3, 3), activation='relu'),\n MaxPooling2D(2, 2),\n Flatten(),\n Dense(64, activation='relu'),\n Dense(num_classes, activation='softmax')\n ])\n model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n return model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:27:44.538887Z","iopub.execute_input":"2025-05-26T06:27:44.539218Z","iopub.status.idle":"2025-05-26T06:27:44.545803Z","shell.execute_reply.started":"2025-05-26T06:27:44.539189Z","shell.execute_reply":"2025-05-26T06:27:44.544642Z"}},"outputs":[],"execution_count":6},{"cell_type":"code","source":"import requests\nfrom PIL import Image\nfrom io import BytesIO\nimport numpy as np\n\ndef load_image_from_url(url, target_size=(128, 128)):\n response = requests.get(url)\n img = Image.open(BytesIO(response.content)).convert('RGB')\n img = img.resize(target_size)\n return np.expand_dims(np.array(img) / 255.0, axis=0)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:28:19.537682Z","iopub.execute_input":"2025-05-26T06:28:19.538003Z","iopub.status.idle":"2025-05-26T06:28:19.543945Z","shell.execute_reply.started":"2025-05-26T06:28:19.537979Z","shell.execute_reply":"2025-05-26T06:28:19.542818Z"}},"outputs":[],"execution_count":8},{"cell_type":"code","source":"import requests\nfrom PIL import Image\nfrom io import BytesIO\nimport numpy as np\nfrom tensorflow.keras.applications.mobilenet_v2 import preprocess_input\n\ndef load_image_from_url(url, target_size=(224, 224)):\n \"\"\"\n Load and preprocess image from a URL for model prediction.\n \"\"\"\n response = requests.get(url)\n img = Image.open(BytesIO(response.content)).convert(\"RGB\")\n img = img.resize(target_size)\n img_array = np.array(img)\n img_array = np.expand_dims(img_array, axis=0)\n return preprocess_input(img_array)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:29:37.033741Z","iopub.execute_input":"2025-05-26T06:29:37.034598Z","iopub.status.idle":"2025-05-26T06:29:37.040699Z","shell.execute_reply.started":"2025-05-26T06:29:37.034545Z","shell.execute_reply":"2025-05-26T06:29:37.039443Z"}},"outputs":[],"execution_count":10},{"cell_type":"code","source":"from PIL import Image\nimport requests\nfrom io import BytesIO\nimport numpy as np\n\ndef load_image_from_url(url, target_size=(224, 224)):\n try:\n response = requests.get(url)\n img = Image.open(BytesIO(response.content)).convert('RGB')\n img = img.resize(target_size)\n img_array = np.array(img) / 255.0\n return np.expand_dims(img_array, axis=0)\n except Exception as e:\n print(f\"❌ Error loading image: {e}\")\n return None\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:33:29.899406Z","iopub.execute_input":"2025-05-26T06:33:29.899773Z","iopub.status.idle":"2025-05-26T06:33:29.907597Z","shell.execute_reply.started":"2025-05-26T06:33:29.899746Z","shell.execute_reply":"2025-05-26T06:33:29.906174Z"}},"outputs":[],"execution_count":12},{"cell_type":"code","source":"from tensorflow.keras.models import load_model, Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\n\nimport os\n\ndef get_or_create_dummy_model(path=\"/kaggle/working/skin_disease_model.h5\"):\n if os.path.exists(path):\n return load_model(path)\n\n print(\"⚠️ No trained model found. Creating a dummy model for demo...\")\n model = Sequential([\n Conv2D(16, (3, 3), activation='relu', input_shape=(224, 224, 3)),\n MaxPooling2D(2, 2),\n Flatten(),\n Dense(10, activation='softmax')\n ])\n model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n model.save(path)\n return model\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:33:45.895624Z","iopub.execute_input":"2025-05-26T06:33:45.896160Z","iopub.status.idle":"2025-05-26T06:33:45.902861Z","shell.execute_reply.started":"2025-05-26T06:33:45.896131Z","shell.execute_reply":"2025-05-26T06:33:45.901670Z"}},"outputs":[],"execution_count":14},{"cell_type":"code","source":"import pandas as pd\n\ndef diagnose_and_recommend(image_url, model_path, csv_path):\n model = get_or_create_dummy_model(model_path)\n image = load_image_from_url(image_url)\n if image is None:\n return\n\n # Predict\n preds = model.predict(image)\n predicted_class_index = np.argmax(preds)\n \n # Map index to skin concerns (adjust to match your actual model)\n classes = [\"acne\", \"aging\", \"dryness\", \"sensitivity\", \"pigmentation\", \n \"eczema\", \"rosacea\", \"dark circles\", \"wrinkles\", \"scars\"]\n predicted_concern = classes[predicted_class_index]\n \n print(f\"\\n🔍 Detected Concern: **{predicted_concern.upper()}**\")\n\n # Load product dataset\n df = pd.read_csv(csv_path)\n df['price'] = df['price'].replace('[£$,]', '', regex=True).astype(float)\n \n # Ingredients mapping\n concern_ingredients = {\n \"acne\": [\"salicylic acid\", \"benzoyl peroxide\", \"niacinamide\", \"azelaic acid\", \"tea tree\"],\n \"dryness\": [\"hyaluronic acid\", \"glycerin\", \"ceramide\", \"squalane\"],\n \"aging\": [\"retinol\", \"peptides\", \"vitamin c\", \"niacinamide\"],\n \"sensitivity\": [\"allantoin\", \"panthenol\", \"madecassoside\", \"centella\"],\n \"pigmentation\": [\"vitamin c\", \"kojic acid\", \"azelaic acid\", \"niacinamide\"],\n }\n\n ingredients = concern_ingredients.get(predicted_concern, [predicted_concern])\n pattern = '|'.join(ingredients)\n \n filtered = df[df['clean_ingreds'].str.contains(pattern, case=False, na=False)]\n filtered = filtered.sort_values(by='price').head(5)\n\n if filtered.empty:\n print(\"⚠️ No matching products found.\")\n return\n\n print(\"\\n🧴 Recommended Products:\\n\")\n for _, row in filtered.iterrows():\n print(f\"🔹 {row['product_name']}\")\n print(f\" 🧪 {row['clean_ingreds']}\")\n print(f\" 💰 £{row['price']}\\n\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:44:27.615058Z","iopub.execute_input":"2025-05-26T06:44:27.615388Z","iopub.status.idle":"2025-05-26T06:44:27.626863Z","shell.execute_reply.started":"2025-05-26T06:44:27.615367Z","shell.execute_reply":"2025-05-26T06:44:27.625111Z"}},"outputs":[{"traceback":["\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_31/638667709.py\"\u001b[0;36m, line \u001b[0;32m18\u001b[0m\n\u001b[0;31m classes = [\"acne\", \"aging\", \"dryness\", \"sensitivity\", \"pigmentation\",\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m unexpected indent\n"],"ename":"IndentationError","evalue":"unexpected indent (638667709.py, line 18)","output_type":"error"}],"execution_count":21},{"cell_type":"code","source":"import numpy as np\nimport requests\nfrom io import BytesIO\nfrom PIL import Image\nfrom tensorflow.keras.models import load_model\nfrom tensorflow.keras.preprocessing.image import img_to_array\n\n# Define your classes here (must match model training)\nCLASSES = [\"acne\", \"aging\", \"dryness\", \"sensitivity\", \"pigmentation\", \n \"eczema\", \"rosacea\", \"dark circles\", \"wrinkles\", \"scars\"]\n\nIMG_SIZE = (224, 224) # Adjust based on your model input size\n\ndef load_image_from_url(url):\n try:\n response = requests.get(url)\n response.raise_for_status()\n img = Image.open(BytesIO(response.content)).convert('RGB')\n img = img.resize(IMG_SIZE)\n img_array = img_to_array(img) / 255.0 # normalize pixel values\n img_array = np.expand_dims(img_array, axis=0) # add batch dimension\n return img_array\n except Exception as e:\n print(f\"❌ Failed to load image: {e}\")\n return None\n\ndef predict_disease(image_url):\n print(\"📥 Loading model...\")\n model_path = \"/kaggle/working/skin_disease_model.h5\" # Update if different path\n try:\n model = load_model(model_path)\n except Exception as e:\n print(f\"❌ Failed to load model: {e}\")\n return\n\n print(\"🌐 Downloading and preprocessing image...\")\n img = load_image_from_url(image_url)\n if img is None:\n return\n\n preds = model.predict(img)\n print(\"Prediction output shape:\", preds.shape) # Should be (1, 10)\n\n class_index = np.argmax(preds[0])\n confidence = preds[0][class_index] * 100\n\n if 0 <= class_index < len(CLASSES):\n diagnosis = CLASSES[class_index]\n print(f\"\\n✅ Predicted Diagnosis: **{diagnosis.capitalize()}**\")\n print(f\"🔎 Confidence: {confidence:.2f}%\")\n else:\n print(\"❌ Error: predicted class index is out of range!\")\n\nif __name__ == \"__main__\":\n user_url = input(\"🔗 Enter image URL for diagnosis: \").strip()\n predict_disease(user_url)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-26T06:47:05.950965Z","iopub.execute_input":"2025-05-26T06:47:05.951324Z","iopub.status.idle":"2025-05-26T06:48:05.167834Z","shell.execute_reply.started":"2025-05-26T06:47:05.951301Z","shell.execute_reply":"2025-05-26T06:48:05.166805Z"}},"outputs":[{"output_type":"stream","name":"stdin","text":"🔗 Enter image URL for diagnosis: https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Akne-jugend.jpg/500px-Akne-jugend.jpg\n"},{"name":"stdout","text":"📥 Loading model...\n🌐 Downloading and preprocessing image...\n\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 82ms/step\nPrediction output shape: (1, 10)\n\n✅ Predicted Diagnosis: **Wrinkles**\n🔎 Confidence: 22.24%\n","output_type":"stream"}],"execution_count":22}]}