Une introduction aux enjeux de mise en production
D’autres cours que je donne à l’ENSAE ou l’Insee peuvent vous intéresser:
Python
pour la data science ;R
et Git
;Et surtout consultez le portail complet de formation du datalab de l’Insee
Pourquoi le machine learning ?
info_mutations == "Tableau" ? html`<div>${table_mutations1}<div>` : html`<div>${plot_mutations}<div>`
url = "https://files.data.gouv.fr/geo-dvf/latest/csv/2020/communes/92/92049.csv"
proxy = "https://corsproxy.io/?"
dvf = d3.csv(proxy + url)
table_mutations1 = Inputs.table(dvf, {"columns": ['date_mutation', 'valeur_fonciere', 'adresse_nom_voie']})
plot_mutations = Plot.plot({
y: {grid: true, label: "Nombre de transactions"},
x: {
ticks: 12,
transform: (d) => Math.pow(10, d),
type: "log",
tickFormat: "~s",
label: "Prix (échelle log) →"
},
marks: [
Plot.rectY(
dvf.filter(d => d.valeur_fonciere > 10000),
Plot.binX({y: "count"},
{
x: d => Math.log10(d.valeur_fonciere),
tip: true
})
),
Plot.ruleY([0])
]
})
info_power_plants == "Tableau" ? html`<div>${table_power_plants}<div>` : html`<div>${plot_power_plants}<div>`
import {us_power_plants, states} from "@observablehq/build-your-first-map-with-observable-plot"
table_power_plants = Inputs.table(
us_power_plants
)
plot_power_plants = Plot.plot({
projection: "albers-usa",
marks: [
Plot.geo(states, { fill: "white", stroke: "#e2e2e2" }),
Plot.dot(us_power_plants, {
x: "longitude",
y: "latitude",
r: "Total_MW",
fill: "PrimSource",
opacity: 0.7,
tip: true
}),
Plot.dot(us_power_plants, { // Can you figure out what this additional Plot.dot layer adds?
x: "longitude",
y: "latitude",
r: "Total_MW",
fill: "PrimSource",
stroke: "black",
filter: d => d.Total_MW > 3500,
}),
Plot.text(us_power_plants, { // Add text to the map using data from us_power_plants
x: "longitude", // Place text horizontally at plant longitude
y: "latitude", // Place text vertically at plant latitude
text: "Plant_Name", // The text that appears is the value from the Plant_Name column,
filter: (d) => d.Total_MW > 3500, // Only add text for plants with capacity exceeding 3500 MW
fontSize: 12, // Increased font size
fontWeight: 600, // Increased font weight
stroke: "white", // Adds white outer stroke to text (for readability)
fill: "black", // Text fill color
textAnchor: "start", // Left align text with the x- and y-coordinates
dx: 15 // Shifts text to the right (starting from left alignment with coordinate)
})
],
r: { range: [1, 15] },
color: { legend: true },
height: 500,
width: 800,
margin: 50
})
d3.json(urlApe).then(res => {
var IC, results;
({ IC, ...results } = res);
IC = parseFloat(IC);
const rows = Object.values(results).map(obj => {
return `
<tr>
<td>${obj.code} | ${obj.libelle}</td>
<td>${obj.probabilite.toFixed(3)}</td>
</tr>
`;
}).join('');
const confidenceRow = `<tr>
<td colspan="2" style="text-align:left; "><em>Indice de confiance : ${IC.toFixed(3)}</em></td>
</tr>`;
const tableHTML = html`
<table>
<caption>
Prédiction de l'activité
</caption>
<tr>
<th style="text-align:center;">Libellé (NA2008)</th>
<th>Probabilité</th>
</tr>
${rows}
${confidenceRow}
</table>`;
// Now you can use the tableHTML as needed, for example, inserting it into the DOM.
// For example, assuming you have a container with the id "tableContainer":
return tableHTML;
});
Scikit-Learn
: un point d’entrée unifiéL’activité du data scientist tend à se rapprocher de celle du développeur :
projets intenses en code
projets collaboratifs et de grande envergure
complexification des données et des infrastructures
déploiement d’applications pour valoriser les analyses
DevOps
MLOps
Le DevOps n’intègre pas les spécificités liées à la data science ;
DataOps : déploiement et maintenance de pipelines de données ;
MLOps : déploiement et maintenance de modèles de Machine Learning ;
Note
Les bonnes pratiques favorisent la collaboration et facilitent les déploiements.
Définition
SSP Cloud
Note
Plus de détails dans la documentation du SSP Cloud
Vous pouvez adopter le format prenomnom en faisant attention aux règles précédentes. Par exemple, si vous vous appelez Jérôme-Gérard L’Hâltère, votre nom d’utilisateur pourra être jeromegerardlhaltere.
Scikit
;
Progresser pas à pas pour faciliter l’utilisation du modèle:
predict
;Note
Chaque étape est une progression dans l’échelle de la technicité et de la reproductibilité.
API : interface entre l’utilisateur (client) et le modèle entraîné
API REST : permet de requêter le modèle avec une syntaxe simple (HTTP) et de manière scalable
Scikit
: preprocessing, training ;predict
.def predict(
month: int = 3,
nombre_lots: int = 1,
code_type_local: int = 2,
nombre_pieces_principales: int = 3,
surface: float = 75
) -> float:
"""
"""
df = pd.DataFrame(
{
"month": [month],
"Nombre_de_lots": [nombre_lots],
"Code_type_local": [code_type_local],
"Nombre_pieces_principales": [nombre_pieces_principales],
"surface": [surface]
}
)
prediction = model.predict(df)
return prediction
FastAPI
: framework simple pour créer une API avec
@app.get("/predict", tags=["Predict"])
async def predict(
month: int = 3,
nombre_lots: int = 1,
code_type_local: int = 2,
nombre_pieces_principales: int = 3,
surface: float = 75
) -> float:
"""
"""
df = pd.DataFrame(
{
"month": [month],
"Nombre_de_lots": [nombre_lots],
"Code_type_local": [code_type_local],
"Nombre_pieces_principales": [nombre_pieces_principales],
"surface": [surface]
}
)
prediction = model.predict(df)
return prediction
CI/CD: kesako ?
Kubernetes
on premiseurl_api_dvf = `https://dvf-simple-api.lab.sspcloud.fr/predict?month=4&nombre_lots=1&code_type_local=2&nombre_pieces_principales=${pieces_principales}&surface=${surface}`
url_api_print = md`[<span class="blue-underlined">https://dvf-simple-api.lab.sspcloud.fr/predict?</span>month=4&nombre_lots=1&code_type_local=2&nombre_pieces_principales=<span class="blue-underlined">${pieces_principales}</span>&surface=<span class="blue-underlined">${surface}</span>](${url_api_dvf})`
value = d3.json(url_api_dvf).then(data => {
// Access the 'value' property from the object
let originalNumber = data;
// Convert it to a floating-point number
let numericValue = parseFloat(originalNumber);
// Round the number
let roundedNumber = Math.round(numericValue).toLocaleString();
return roundedNumber;
}).catch(error => console.error('Error:', error));
Scikit
& FastAPI
: combo 🔥 pour mettre à disposition un modèle ;Quelques ressources complémentaires
MLOps
(collègues de l’Insee 😉).Corrections:
PSL Data Week