Partager via



Juillet 2015

Volume 30, numéro 7

Test Run - régression linéaire en utilisant c#

Par James McCaffrey

James McCaffreyL'objectif d'un problème de régression linéaire est de prédire la valeur d'une variable numérique basée sur les valeurs d'une ou plusieurs variables prédictives numérique. Par exemple, vous pourriez vouloir prédire le revenu annuel d'une personne fondée sur son niveau d'éducation, les années d'expérience de travail et le sexe (male = 0, femelle = 1).

La variable à prédire est habituellement appelée la variable dépendante. Les variables prédictives sont généralement appelés les variables indépendantes. Lorsqu'il y a juste une variable variable explicative, la technique est parfois appelée la régression linéaire simple. Lorsqu'il y a deux ou plusieurs variables prédictives, cette technique est généralement appelée multiples, ou régression multivariée, linéaire.

Un bon moyen de voir où va cet article doit avoir un regard sur le programme de démonstration en Figure 1. Le programme de démonstration de c# prédit le revenu annuel basé sur l'éducation, de travail et de sexe. La démo commence en générant des 10 éléments de données synthétiques. Niveau de scolarité est une valeur comprise entre 12 et 16. Expérience de travail est une valeur comprise entre 10 et 30. Le sexe est une variable indicateur où le mâle est la valeur de référence, codée par 0, et la femelle est codée 1. Revenu, en milliers de dollars, est dans la dernière colonne. Dans un scénario non-demo, vous liriez probablement les données d'un fichier texte à l'aide d'une méthode appelée quelque chose comme MatrixLoad.

Linear Regression Using C#
Figure 1 régression linéaire en utilisant c#

Après avoir généré les données synthétiques, le programme de démonstration utilise les données pour créer ce qu'on appelle une matrice de conception. Une matrice de conception est juste la matrice de données avec une colonne principale de toutes les valeurs 1.0 ajouté. Il existe plusieurs algorithmes différents qui peuvent être utilisés pour la régression linéaire ; certains peuvent utiliser la matrice de données brutes, alors que d'autres utilisent une matrice de conception. La démonstration utilise une technique qui requiert une matrice de conception.

Après avoir créé la matrice de la conception, le programme de démonstration détecte que les valeurs de coefficients de quatre, (1.0180, 0.5489, 12.0157,-2.9566). Les coefficients sont parfois appelés b-valeurs ou bêta. La première valeur, 12.0157, est généralement appelée l'ordonnée à l'origine. C'est une constante non associée à une variable explicative. Le second, les valeurs de coefficient de troisième et quatrième (1.0180, 0.5489,-2.9566) sont associés à edu­cation de niveau, expérience de travail et sexe, respectivement.

La toute dernière partie de la production en Figure 1 utilise les valeurs des coefficients pour prévoir les revenus d'une personne hypothétique qui possède un niveau d'éducation de 14 ; 12 ans d'expérience professionnelle ; et dont le sexe est 0 (mâle). Les revenus prévus sont 32,86, qui est calculée comme suit :

income = 12.0157 + (1.0180)(14) + (0.5489)(12) + (-2.9566)(0)
                = 12.0157 + 14.2520 + 6.5868 + 0
                = 32.86

En d'autres termes, pour faire une prédiction par régression linéaire, les valeurs prédictives sont multipliées par leurs valeurs de coefficient correspondant et additionnés. C'est très simple. Notez que la valeur d'interligne intercept (12.0157 dans l'exemple) peut être considéré comme un coefficient associé à une variable explicative qui a toujours la valeur 1. Ce fait explique en partie, la colonne de valeurs 1.0 dans la matrice de la conception.

L'essence d'un problème de régression linéaire est le calcul des valeurs des coefficients en utilisant les données brutes ou façon équivalente, la matrice de la conception. Ce n'est pas si facile. La démonstration utilise une technique appelée inversion de matrice de forme finie, également connu sous le nom la méthode des moindres carrés ordinaires. Les autres techniques pour trouver les valeurs des coefficients incluent des moindres carrés itérativement repondérés, estimation du maximum de vraisemblance, régression, descente de gradient et plusieurs autres.

Dans Figure 1, avant que la prédiction faite, le programme de démonstration calcule une mesure appelée la valeur R2, qui est aussi appelée le coefficient de détermination. R2 est une valeur comprise entre 0 et 1 qui décrit la façon dont le modèle prédictif concorde avec les données brutes. Elle est parfois exprimée comme, « le pourcentage de variation expliquée par le modèle. » Lâchement interprété, plus R2 est de 1, le mieux est du modèle prédictif. La valeur de la démo de 0.7207, soit 72 %, serait considérée relativement élevée (bon) pour les données réelles.

Cet article suppose que vous avez au moins intermédiaire c#, compétences en programmation, mais ne suppose que vous savez quelque chose sur la régression linéaire. Le programme de démonstration est trop long pour présenter dans son intégralité, mais le code source complet est disponible dans le téléchargement qui accompagne cet article.

Comprendre la régression linéaire

Régression linéaire est généralement mieux expliquée à l'aide d'un diagramme. Regardez le graphique en Figure 2. Les données dans le graphique représentent prévoir un revenu annuel de seulement une seule variable, années d'expérience professionnelle. Les points rouges correspondent à un point de données. Par exemple, l'élément de données à l'extrême gauche a travail = 10 et revenu = 32,06. Régression linéaire conclut deux coefficients : ordonnée à l'un origine et l'autre pour la variable de travail. Il s'avère que les valeurs des coefficients sont 27.00 et 0,43.

Linear Regression with One Independent Variable
Figure 2 régression linéaire avec une Variable indépendante

Les valeurs des coefficients déterminent l'équation d'une ligne, ce qui est affichée en bleu en Figure 2. La ligne (les coefficients) minimise la somme des écarts au carré entre les points de données réelles (yi) et les données prévues (fi). Deux des 10 déviations sont montrés avec des lignes en pointillés dans Figure 2. La première déviation montrée est yi - fi = 28,6-32,6 = - 4,0. Notez que les écarts peuvent être positif ou négatif. Si les écarts ne sont pas élevés au carré, les négatifs et positifs pourraient s'annulent mutuellement.

Le graphique en Figure 2 montre une régression linéaire simple, avec une seule variable indépendante, fonctionne. Régression linéaire multivariée s'étend la même idée — trouver les coefficients qui réduisent au minimum la somme des écarts au carré — à l'aide de plusieurs variables indépendantes.

Exprimé de façon intuitive, régression linéaire trouve la meilleure ligne grâce à un ensemble de points de données. Cette meilleure ligne peut être utilisée pour la prédiction. Par exemple, dans Figure 2, si une personne hypothétique avait 25 ans d'expérience professionnelle, son revenu prévu sur la ligne bleue serait environ 38.

Résolution de l'équation de la méthode des moindres carrés

Si un problème de régression linéaire a variables prédictives n, alors n + 1 coefficient de valeurs doivent être trouvés, un pour chaque indicateur, plus la valeur de l'ordonnée à l'origine. Le programme de démonstration utilise la technique plus simple de trouver les valeurs des coefficients. Les valeurs des coefficients sont souvent donnés en utilisant l'équation un peu intimidante montrés dans Figure 3. L'équation n'est pas aussi compliquée qu'on pourrait le croire tout d'abord.

Linear Regression Coefficients Solution Using Matrices
Solution de Coefficients de régression linéaire figure 3 à l'aide de Matrices

La lettre grecque bêta ressemble à un script B et représente les valeurs des coefficients. Notez que toutes les lettres dans l'équation sont en gras, qui en mathématiques indique qu'ils représentent des objets de valeurs multiples (matrices ou baies/vecteurs) plutôt que de simples valeurs scalaires (numéros de plaines). Majuscule X représente la matrice de la conception. X en majuscules avec un exposant de T désigne la transposée de la matrice de la conception. Le * symbole signifie la multiplication de matrices. L'exposant de-1 signifie inversion de matrice. Y majuscule est un vecteur colonne (une matrice avec une seule colonne) de valeurs de la variable dépendante. Par conséquent, de problèmes pour les valeurs des coefficients signifie vraiment comprendre les opérations de matrice.

Les schémas de Figure 4 illustrent la transposition de la matrice, la multiplication de matrices et inversion de matrice. La transposée d'une matrice juste permute lignes et colonnes. Par exemple, supposons que vous avez une matrice 2 x 3, c'est, l'une avec 2 lignes et 3 colonnes. La transposée de la matrice sera de 3 x 2 où les lignes de la matrice originelle deviennent les colonnes de la matrice de transposition.

Three Matrix Operations Used to Find Linear Regression Coefficients
Figure 4 trois opérations de matrice permettant de trouver les Coefficients de régression linéaire

Multiplication de matrice peut sembler un peu bizarre si vous n'avez pas rencontré avant. Si vous multipliez une (n x m) fois de la matrice de taille un (m x p) taille de matrice, le résultat est une (p x n) taille de matrice. Par exemple, un 3 x 4 * une matrice 4 x 2 a taille 3 x 2. Une discussion détaillée de la multiplication de matrices déborde le cadre de cet article, mais une fois que vous avez vu quelques exemples, le processus est facile à comprendre et facile à implémenter dans le code.

La troisième opération de matrice pour résoudre pour les valeurs des coefficients de régression linéaire est inversion de matrice, qui, malheureusement, est difficile à comprendre et difficile à mettre en œuvre. Aux fins du présent article, il suffit de savoir que c'est l'inverse d'une matrice définie uniquement lorsque la matrice a le même nombre de lignes et de colonnes (une matrice carrée). Figure 4montre une matrice 3 x 3 et son inverse.

Il existe plusieurs algorithmes qui peuvent être utilisés pour trouver l'inverse d'une matrice. Le programme de démonstration utilise une technique appelée décomposition de Doolittle.

Pour résumer, un problème de régression linéaire avec variables prédictives n consiste à trouver les valeurs pour n + 1 coefficients. Cela peut être fait à l'aide de matrices avec transposition de matrice, la multiplication de matrices et inversion de matrice. Transposition et la multiplication sont faciles, mais il est difficile de trouver l'inverse d'une matrice.

La Structure du programme démo

Pour créer le programme de démonstration, j'ai lancé Visual Studio et choisi le modèle de projet application console. J'ai nommé le projet LinearRegression. Le programme n'a aucune dépendance significative de .NET Framework donc n'importe quelle version de Visual Studio fonctionnera.

Une fois le code du modèle chargé dans l'éditeur, dans la fenêtre de l'Explorateur de solutions, j'ai cliqué sur fichier Program.cs et la renomme à LinearRegressionProgram.cs. J'ai autorisé Visual Studio auto­matiquement renommer class Program. En haut de la fenêtre de l'éditeur, j'ai supprimé tout à l'aide des déclarations sauf celui faisant référence à l'espace de noms System niveau supérieur.

La structure générale du programme de démonstration, avec quelques modifications mineures pour économiser l'espace, est présentée dans Figure 5. Toute la logique de commande de programme est dans la méthode Main. Le programme de démonstration utilise une approche de la méthode statique plutôt qu'une approche orientée objet.

Structure de programme démo figure 5 régression linéaire

using System;
namespace LinearRegression
{
  class LinearRegressionProgram
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Begin linear regression demo");
      // Generate synthetic data
      // Create design matrix
      // Solve for LR coefficients
      // Calculate R-squared value
      // Do a prediction
      Console.WriteLine("End linear regression demo");
      Console.ReadLine();
    }
    static double Income(double x1, double x2,
      double x3, double[] coef) { . . }
    static double RSquared(double[][] data,
      double[] coef) { . . }
    static double[][] DummyData(int rows,
      int seed) { . . }
    static double[][] Design(double[][] data) { . . }
    static double[] Solve(double[][] design) { . . }
    static void ShowMatrix(double[][] m, int dec) { . . }
    static void ShowVector(double[] v, int dec) { . . }
    // ----------
    static double[][] MatrixTranspose(double[][] matrix)
      { . . }
    static double[][] MatrixProduct(double[][] matrixA,
      double[][] matrixB) { . . }
    static double[][] MatrixInverse(double[][] matrix)
      { . . }
    // Other matrix routines here
  }
} // ns

Revenu de la méthode retourne un revenu prévu de paramètres d'entrée avec les valeurs de niveau de scolarité, expérience de travail et le sexe à l'aide d'un tableau de valeurs des coefficients. Méthode r retourne la valeur de R au carré du modèle de données ainsi que les coefficients. Méthode DummyData génère les données synthétiques utilisées pour la démonstration.

Conception de la méthode accepte une matrice de données et renvoie une matrice de conception augmentée avec une colonne principale des valeurs 1.0. Méthode résoudre accepte une matrice de conception et utilise des opérations de matrice pour trouver les coefficients de régression linéaire.

La plupart du travail se fait par un ensemble de méthodes statiques qui effectuent des opérations de matrice. Le programme de démonstration définit une matrice dans le plus simple possible, comme un tableau de tableaux. Une alternative consiste à créer une classe matrice définie par programme, mais à mon avis que l'approche est inutilement compliquée. Tableaux parfois ordinaires sont préférables aux objets définis par programme.

Méthode MatrixTranspose renvoie la transposition d'une matrice. Méthode MatrixProduct renvoie le résultat de la multiplication des deux matrices. Méthode MatrixInverse renvoie l'inverse d'une matrice. La démo a plusieurs méthodes d'assistance. En particulier, la méthode MatrixInverse appelle les méthodes d'assistance MatrixDuplicate, MatrixDecompose et HelperSolve.

La méthode de résoudre

Le cœur du programme de démonstration de régression linéaire est la méthode Solve. Définition de la méthode commence par :

static double[] Solve(double[][] design)
{
  int rows = design.Length;
  int cols = data[0].Length;
  double[][] X = MatrixCreate(rows, cols - 1);
  double[][] Y = MatrixCreate(rows, 1);
...

Le seul paramètre d'entrée est une matrice de conception. Une autre approche, que vous voudrez peut-être envisager consiste à passer de la matrice de données source et puis avoir Solve appeler la méthode d'assistance conception pour obtenir la matrice de la conception. Méthode d'assistance MatrixCreate alloue de l'espace pour et retourne, une matrice avec le nombre spécifié de lignes et de colonnes. Le local du secteur X matrice contient les valeurs des variables indépendantes (avec une valeur de 1,0 leader). La matrice Y locale a juste une seule colonne et contient les valeurs de la variable dépendante (revenu annuel dans la démo).

Ensuite, les cellules dans les matrices X et Y sont renseignées en utilisant les valeurs dans la matrice de conception :

int j;
for (int i = 0; i < rows; ++i)
{
  for (j = 0; j < cols - 1; ++j)
  {
    X[i][j] = design[i][j];
  }
  Y[i][0] = design[i][j]; // Last column
}

Notez que j variable index est déclaré hors l'imbriqués pour les boucles, donc il peut être utilisé pour remplir la matrice Y. Avec les matrices X et Y dans la main, les coefficients de la régression linéaire peuvent être trouvées selon l'équation montrée Figure 3:

...
  double[][] Xt = MatrixTranspose(X);
  double[][] XtX = MatrixProduct(Xt, X);
  double[][] inv = MatrixInverse(XtX);
  double[][] invXt = MatrixProduct(inv, Xt);
  double[][] mResult = MatrixProduct(invXt, Y);
  double[] result = MatrixToVector(mResult);
  return result;
} // Solve

Dans la démo, matrice X a taille 10 x 4 sa transposée, Xt, a taille 4 x 10. Le produit de Xt et X a format 4 x 4 et l'inverse, inv, dispose également de format 4 x 4. En général, pour un problème de régression linéaire avec les variables de facteur prédictif indépendant n, lors de l'utilisation de la technique d'inversion de matrice que vous devrez trouver l'inverse d'une matrice de taille (n + 1) × (n + 1). Cela signifie que la technique d'inversion n'est pas adaptée pour les problèmes de régression linéaire qui ont un grand nombre de variables explicatives.

Le produit de la matrice inverse de 4x4 et de la matrice de la transposition de 4 x 10, invXt dans le code, a la taille 4 x 10. Le produit de l'invXt et la matrice de 10 x 1 Y, mResult ("résultat de la matrice ») dans le code, a la taille 4 x 1. Ces valeurs sont les coefficients dont vous avez besoin. Pour plus de commodité, les valeurs dans la matrice colonne unique Y sont transférées à un tableau ordinaire à l'aide de la méthode d'assistance MatrixToVector.

Calculer le coefficient de détermination

Tel que mentionné précédemment, la métrique de R au carré est une mesure de la façon dont les points de données réelles s'adapter la courbe de régression calculées. En termes mathématiques, R au carré est défini comme R2 = 1 - (SSres / SStot). Le terme SSres est généralement appelé « la somme résiduelle des carrés ». C'est la somme des différences quadratiques entre les valeurs Y réelles et les valeurs Y prédites, comme illustré dans le graphique en Figure 2. Le terme SStot est la « somme des carrés totale ». C' est la somme du carré diffèrent­ences entre chaque valeur de Y réel et la moyenne (moyenne) de toutes les valeurs Y réelles.

La métrique R2 de la régression linéaire est aussi appelée le coefficient de détermination et est liée à, mais différents, des autres statistique métrique nommé R2 ("peu r-squared »). Interprétation de R2 est un peu délicat et dépend du domaine de problème particulier sous enquête. Pour les sciences naturelles et sociales, où les données sont généralement sale et incomplète, un coefficient de 0,6 ou plus est souvent considéré comme assez bon.

Il y a une autre mesure de la variance expliquée par le modèle de régression appelé l'ajusté R au carré. Cette mesure prend en compte le nombre de variables prédictives et le nombre d'éléments de données. Pour la plupart des cas, à l'aide de la plain R² est assez bon pour avoir une idée de la qualité prédictive d'un modèle de régression linéaire.

Jaquette en haut

Si vous recherchez l'Internet pour obtenir des exemples de comment faire une régression linéaire en utilisant un langage de programmation, vous ne trouverez de très nombreuses références. Selon moi, il y a deux raisons principales à ce manque relatif de l'information. Tout d'abord, résoudre pour les coefficients de régression linéaire à l'aide d'opérations de matrice est assez difficile, surtout à cause de l'opération d'inversion de matrice. D'une certaine façon, je considère la méthode MatrixInverse du programme de démonstration de figurer parmi les routines de code plus compliqués que j'ai jamais écrit. Deuxièmement, il ya beaucoup d'autonome les outils existants qui peuvent effectuer une régression linéaire, en particulier, le programme de feuille de calcul Excel avec son complément l'analyse des données. Il est relativement rare d'avoir besoin d'inclure directement du code de solution de régression linéaire dans un système logiciel.

Régression linéaire a été étudiée pendant des décennies et il ya plusieurs façons d'étendre la technique. Par exemple, vous pouvez introduire ce qu'on appelle les effets de l'interaction qui combinent deux ou plusieurs variables prédictives. Ces extensions sont parfois appelées des modèles linéaires généralisés pour les distinguer de la forme de base de la régression linéaire.

À mon avis, la régression linéaire est la technique de « Hello World » de statistiques classiques. Il n'y a aucun clair, universellement convenue à la distinction entre la statistique classique et apprentissage machine, mais j'ai tendance à penser à des techniques statistiques classiques comme ceux qui ont été étudiés par les mathématiciens dès le début des années 1900. Dans mon esprit, les techniques d'apprentissage automatique, comme la classification des réseaux de neurones, sont ceux qui sont plus récents, apparue dans les années 1950. Régression linéaire classique statistiques est étroitement liée à une machine à apprendre la technique de régression logistique, ce qui a été le sujet de plusieurs colonnes de série de tests.


Dr. James McCaffrey travaille pour Microsoft Research à Redmond, Washington  Il a travaillé sur plusieurs produits Microsoft, y compris Internet Explorer et Bing. Dr. McCaffrey est joignable au jammc@microsoft.com.

Grâce à l'expert technique Microsoft Research suivant d'avoir relu cet article : Charles Parker