Environnement - Packages

# activer l'environnement
using Pkg
Pkg.activate("env_julia_pythoncall")
  Activating project at `c:\Users\ricco\Desktop\demo\env_julia_pythoncall`
# liste des packages installés
Pkg.status()
Status `C:\Users\ricco\Desktop\demo\env_julia_pythoncall\Project.toml`

  [a93c6f00] DataFrames v1.8.2

  [da1fdf0e] FreqTables v1.0.0

  [7073ff75] IJulia v1.34.4

  [6099a3de] PythonCall v0.9.34

  [fdbf4ff8] XLSX v0.11.10

Données d’apprentissage

# packages
import DataFrames as DFR
import XLSX

# lecture des données en TRAIN
dfTrain = DFR.DataFrame(XLSX.readtable("./breast_pythoncall.xlsx","TRAIN"))

# premières lignes
println(DFR.describe(dfTrain))
10×7 DataFrame

 Row  variable    mean     min     median  max        nmissing  eltype   

      Symbol      Union…   Any     Union…  Any        Int64     DataType 

─────┼────────────────────────────────────────────────────────────────────

   1 │ clump       4.24812  1       4.0     10                0  Int64

   2 │ ucellsize   2.94737  1       1.0     10                0  Int64

   3 │ ucellshape  3.07519  1       1.0     10                0  Int64

   4 │ mgadhesion  2.65915  1       1.0     10                0  Int64

   5 │ sepics      3.1203   1       2.0     10                0  Int64

   6 │ bnuclei     3.28571  1       1.0     10                0  Int64

   7 │ bchromatin  3.3183   1       3.0     10                0  Int64

   8 │ normnucl    2.77444  1       1.0     10                0  Int64

   9 │ mitoses     1.49624  1       1.0     10                0  Int64

  10 │ classe               begnin          malignant         0  String
# y et X
yTrain = dfTrain.classe
XTrain = dfTrain[:,DFR.Not(:classe)]

# vérif. dim
println(DFR.size(yTrain))
println(DFR.size(XTrain))
(399,)
(399, 9)

Modélisation : instanciation, entraînement

Accès à Python : environnement “base” Anaconda

# configurer variable d'environnement
# pour trouver l'interpréteur Python à utilser
# ici l'environnement "base" d'Anaconda
ENV["JULIA_PYTHONCALL_EXE"] = raw"C:\Users\ricco\anaconda3\python.exe"

# puis importer la librairie
using PythonCall
# vérifier la version de Python dispo
sys = pyimport("sys")
println("Version de Python = $(pyconvert(String, sys.version))")
Version de Python = 3.13.9 | packaged by Anaconda, Inc. | (main, Oct 21 2025, 19:09:58) [MSC v.1929 64 bit (AMD64)]
# vérifier la version de scikit-learn dispo
sklearn = pyimport("sklearn")
println("Version de scikit-learn = $(pyconvert(String, sklearn.__version__))")
Version de scikit-learn = 1.7.2

Instanciation

# importer la classe de calcul
LinearSVC = sklearn.svm.LinearSVC

# instancier une régression Lasso
modele = LinearSVC(random_state = 42)
LinearSVC(random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

Entraînement

# lancer l'entraînement du modèle
# attention, typer les X en Matrix
modele.fit(Matrix(XTrain), yTrain)
LinearSVC(random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

Inspection - post-traitement des résultats

# afficher les coefficients
# on a un objet Python
modele.coef_
Python:
array([[0.07444318, 0.00447512, 0.08119902, 0.0383552 , 0.11598208,
        0.10454157, 0.07715406, 0.04552873, 0.13817203]])
# conversion en objet Julia pour post-traitement
coef = pyconvert(Matrix{Float64},modele.coef_)
coef
1×9 Matrix{Float64}:
 0.0744432  0.00447512  0.081199  …  0.0771541  0.0455287  0.138172
# affichage sous forme de DataFrame Julia par ex.
DFR.DataFrame(var = names(XTrain), coef = coef[1,:])
9×2 DataFrame
Row var coef
String Float64
1 clump 0.0744432
2 ucellsize 0.00447512
3 ucellshape 0.081199
4 mgadhesion 0.0383552
5 sepics 0.115982
6 bnuclei 0.104542
7 bchromatin 0.0771541
8 normnucl 0.0455287
9 mitoses 0.138172
# l'intercept
modele.intercept_
Python: array([-2.27970908])

Evaluation en test

Echantillon test

# lecture des données en TEST
dfTest = DFR.DataFrame(XLSX.readtable("./breast_pythoncall.xlsx","TEST"))

# premières lignes
println(DFR.describe(dfTest))
10×7 DataFrame

 Row  variable    mean     min     median  max        nmissing  eltype   

      Symbol      Union…   Any     Union…  Any        Int64     DataType 

─────┼────────────────────────────────────────────────────────────────────

   1 │ clump       4.64333  1       4.0     10                0  Int64

   2 │ ucellsize   3.38333  1       1.0     10                0  Int64

   3 │ ucellshape  3.38333  1       2.0     10                0  Int64

   4 │ mgadhesion  3.00333  1       1.0     10                0  Int64

   5 │ sepics      3.34333  1       2.0     10                0  Int64

   6 │ bnuclei     3.91333  1       1.0     10                0  Int64

   7 │ bchromatin  3.59667  1       3.0     10                0  Int64

   8 │ normnucl    2.99     1       1.0     10                0  Int64

   9 │ mitoses     1.71333  1       1.0     10                0  Int64

  10 │ classe               begnin          malignant         0  String
# y et X
yTest = dfTest.classe
XTest = dfTest[:,DFR.Not(:classe)]

# vérif. dim
println(DFR.size(yTest))
println(DFR.size(XTest))
(300,)
(300, 9)

Prédiction

# prediction en test (objet Python obtenu)
pred_python = modele.predict(Matrix(XTest))
pred_python
Python:
array(['begnin', 'malignant', 'begnin', 'begnin', 'malignant',
       'malignant', 'malignant', 'begnin', 'malignant', 'begnin',
       'begnin', 'malignant', 'malignant', 'malignant', 'begnin',
       'begnin', 'malignant', 'malignant', 'begnin', 'malignant',
       'begnin', 'malignant', 'malignant', 'begnin', 'malignant',
       'begnin', 'begnin', 'malignant', 'begnin', 'begnin', 'begnin',
       'begnin', 'malignant', 'begnin', 'begnin', 'begnin', 'begnin',
       'malignant', 'begnin', 'malignant', 'malignant', 'begnin',
       'begnin', 'malignant', 'begnin', 'begnin', 'begnin', 'begnin',
       'begnin', 'malignant', 'begnin', 'begnin', 'begnin', 'malignant',
                             ... 36 more lines ...
       'begnin', 'begnin', 'begnin', 'begnin', 'begnin', 'begnin',
       'malignant', 'begnin', 'malignant', 'begnin', 'begnin',
       'malignant', 'malignant', 'malignant', 'malignant', 'begnin',
       'begnin', 'begnin', 'begnin', 'begnin', 'malignant', 'begnin',
       'begnin', 'malignant', 'begnin', 'begnin', 'malignant', 'begnin',
       'begnin', 'begnin', 'malignant', 'begnin', 'begnin', 'begnin',
       'malignant', 'begnin', 'begnin', 'malignant', 'begnin',
       'malignant', 'malignant', 'begnin', 'malignant', 'malignant',
       'begnin', 'malignant'], dtype=object)
# transformer en Julia
pred_julia = pyconvert(Vector{String}, pred_python)
pred_julia
300-element Vector{String}:
 "begnin"
 "malignant"
 "begnin"
 "begnin"
 "malignant"
 "malignant"
 "malignant"
 "begnin"
 "malignant"
 "begnin"
 ⋮
 "malignant"
 "begnin"
 "malignant"
 "malignant"
 "begnin"
 "malignant"
 "malignant"
 "begnin"
 "malignant"

Matrice de confusion

# matrice de confusion
import FreqTables as FT
FT.freqtable(yTest,pred_julia)
2×2 Named Matrix{Int64}
Dim1 ╲ Dim2 │    begnin  malignant
────────────┼─────────────────────
begnin      │       180          7
malignant   │         4        109