April 2019

Band 34, Nummer 4

[Azure Confidential Computing]

Sicheres Machine Learning mit mehreren Parteien mit Azure Confidential Computing

Durch Stefano Tempesta

Sicherheit ist entscheidend, bei der Implementierung von Business-Lösungen, die in einer öffentlichen Cloud gehostet werden, insbesondere, wenn vertrauliche Daten und geistigen Eigentums als Teil der Lösung selbst gespeichert werden. Bewährte Methoden vorhanden sind, in der Branche bereits für das Sichern von Daten im Ruhezustand und während der Übertragung, jedoch müssen Sie auch zum Schützen Ihrer Daten vor nicht autorisiertem Zugriff, wenn sie verwendet wird. Azure vertrauliche computing (bit.ly/2BxQkpp) bietet eine neue Ebene der datensicherheit und Verschlüsselung, wenn Ihre Daten mithilfe von vertrauenswürdigen Ausführungsumgebungen (TTEs) verarbeitet wird,. TEEs auf die Hardware oder Software (Hypervisor) implementiert werden Ebene, und geben Sie einen geschützten Prozessor und den Speicherplatz, in dem Ihr Code und Daten können aus in vollständiger Isolation externen Anwendungen und Systeme. TEEs stellen Sie sicher, dass es keine Möglichkeit zum Anzeigen von Daten oder die Vorgänge innerhalb von außen, sogar mit einem Debugger. Sie selbst stellen Sie sicher, dass nur autorisierte Code zulässig ist, auf Daten zugreifen. Wenn der Code geändert oder manipuliert wird, wird die Vorgänge werden abgelehnt, und die Umgebung deaktiviert. Der TEE erzwingt diese Schutzmaßnahmen noch während der Ausführung des Codes darin.

SqlServer mit sicheren Enclaves immer verschlüsselt.

In meinem vorherigen Artikel "Schützen Ihrer Daten mit Azure vertrauliche Computing" (msdn.com/magazine/mt833273), habe ich das computing in Azure vertrauliche vorgestellt und die Open Enclave-SDK zum Erstellen von Anwendungen, die ausgeführt geschützte Code und Daten in einer vertrauenswürdigen ausführungsumgebung. Die gleiche Technologie wird für Azure SQL-Datenbank und SQL Server. Dies ist eine Erweiterung für die Always Encrypted-Funktion, die sicherstellt, dass vertrauliche Daten in einer SQL-Datenbank im jederzeit verschlüsselt können ohne Beeinträchtigung der Funktionalität von SQL-Abfragen. Immer erreicht Verschlüsselung mit Secure Enclaves dies durch das Delegieren von Berechnungen auf sensible Daten zu einer enklave zu, in denen die Daten sicher entschlüsselt und verarbeitet werden. Mit SQL Server-2019 verfügbar, die Enclave-Technologie übernommen, Virtualisierung Virtualisierungsbasierter Sicherheit (VBS) bezeichnet, isoliert Sie einen Bereich des Arbeitsspeichers innerhalb des Adressraums eines Prozesses im Benutzermodus, die vollständig unsichtbar für alle anderen Prozesse und das Windows-Betriebssystem auf der Computer. Sogar Computeradministratoren können finden in den Arbeitsspeicher, der die Enclave nicht. Abbildung 1zeigt, was ein Administrator sehen würden, beim Durchsuchen des Enclave-Speichers mit einem Debugger (Beachten Sie die Frage markiert ist, klicken Sie im Gegensatz zu den tatsächlichen Arbeitsspeicher-Inhalt).

Durchsuchen von einem basierend Security Enclave mit WinDbg
Abbildung 1 eine Virtualisierung durchsuchen-basierte Sicherheit Enclave mit WinDbg

Die Möglichkeit, erweiterte Always Encrypted-Funktion Enclaves verwendet, wird im veranschaulicht abbildung2. SQL Server-Instanz enthält eine Enclave, durch den Code für die Durchführung der Verschlüsselung von Daten als auch den Code, SQL-Vorgänge implementiert geladen. Vor der Übermittlung einer Abfrage mit der SQL Server-Engine für die Verarbeitung, sendet der SQL-Treiber, die von der Clientanwendung verwendet die Verschlüsselungsschlüssel an die Enclave aus, über einen sicheren Kanal. Bei der Verarbeitung von Abfragen, führt die SQL Server-Engine diese Vorgänge direkt innerhalb der enklave zu, in denen die Daten sicher entschlüsselt und verarbeitet werden. Daten verlassen niemals die Enclave unverschlüsselt.

Kommunikation mit SQLServer ist immer mit sicheren Enclaves verschlüsselt.
Abbildung 2 die Kommunikation mit SQLServer ist immer mit sicheren Enclaves verschlüsselt.

Nicht alle Daten in einer Datenbanktabelle erfordert Verschlüsselung an. Bestimmte Spalten können zum Sichern von Daten in einer enklave identifiziert werden. Bei der Analyse einer SQL-Abfrage, bestimmt die SQL Server-Engine, wenn die Abfrage alle Vorgänge für verschlüsselte Daten enthält, die von der sicheren Enclave erfordern. Für Abfragen, in denen die sichere Enclave zugegriffen werden muss, der Clienttreiber sendet die Verschlüsselungsschlüssel für die Tabellenspalten, die für die Vorgänge, um die sichere Enclave erforderlich sind, und er übermittelt, die Abfrage für die Ausführung zusammen mit der verschlüsselten Abfrage Parameter. Daten in die angegebene Spalten gesichert werden nie unverschlüsselt außerhalb der Enclave verfügbar gemacht. SQL Server entschlüsselt Daten, die in diesen Spalten nur innerhalb der sicheren Enclave enthalten. Wenn die Abfrage Parameter für die geschützten Spalten enthält, werden diese Parameter auch in Enclave für entschlüsselt, bevor die Abfrage ausgeführt wird.

Spalten, die sensible Daten enthalten zu verschlüsseln, können mit einer ALTER COLUMN-Anweisung identifiziert werden. Diese Anweisung ist innerhalb der Enclave ausgeführt. Besteht keine Notwendigkeit zum Verschieben von Daten aus der Datenbank für die anfänglichen Verschlüsselung oder für andere verschlüsselungsbezogenen schemaänderungen. Dies verbessert die Leistung und Zuverlässigkeit dieser Vorgänge erheblich, und es erfordert keine spezielle clientseitigen Tools. Die folgende Anweisung vorausgesetzt, dass Sie das Alter der Patienten, die in der ALTER-Spalte der Datenbanktabelle, MedicalRecords enthaltenen schützen möchten, werden die Daten in dieser Spalte mit dem AES-256-Verschlüsselungsalgorithmus verschlüsselt:

ALTER TABLE [dbo].[MedicalRecords]
ALTER COLUMN [Age] [char](11)
ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1],
  ENCRYPTION_TYPE = Randomized,
  ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
GO

Umfassenden Dokumentation finden Sie auf die neuen Funktionen und dazu, wie erste Schritte mit Always Encrypted mit Secure Enclaves am aka.ms/AlwaysEncryptedwithSecureEnclaves.

Mehrere Parteien vertrauliche-Datenquellen

Zusätzlich zu SQL Server ist möglicherweise eine große Anwendung Azure vertrauliche computing in zahlreichen Branchen, darunter Finanzen, Einzelhandel, Behörden und im Gesundheitswesen. Sogar konkurrierende Unternehmen profitieren von der pooling, ihre privaten Datasets, die Training-Machine learning-Modelle für die aggregierten Daten, um höhere Genauigkeit der Vorhersage zu erzielen. Beispielsweise konnte Integrität Institute zusammenarbeiten, indem Sie die gemeinsame Nutzung ihrer privaten Patientendaten wie Genomische Sequenzen und medizinische Daten, um tiefere Einblicke von Machine learning über mehrere Datasets, ohne das Risiko von Daten, die andere Organisationen Zugriff zu erhalten. Können weitere Daten zum Trainieren auf Machine Learning-Algorithmen, um bessere Modelle zu erzeugen. Vertrauliche computing kann für den Datenschutz verwendet werden: Nutzen Sie mehrere Parteien eine gängige Machine learning-Dienst für die aggregierten Daten ausgeführt werden. Obwohl Integrität Institute, in diesem Fall verwenden ihre eigenen Datasets an, die alle eine andere Partei freigegeben werden wollen, sie können jede hochladen die verschlüsselten Daten in einer enklave, remotenachweises ausführen, führen Sie die Machine learning-Code und, schließlich Herunterladen der verschlüsselte Machine Learning-Modell. Das Modell kann auch von allen Parteien, unterliegt die vereinbarten Access-Control-Richtlinien in Enclave für sichere Bewertung gehalten werden.

Abbildung 3 bietet eine Übersicht über ein solches System. Mehrere Kliniken Patienten Datasets, die beide mit einem anderen Schlüssel verschlüsselt werden. Die Kliniken ein vereinbarten Machine learning-Algorithmus in einer enklave in einem clouddatencenter bereitstellen, und geben Sie den Schlüssel für ihre Daten mit der Enclave frei. Die Enclave verarbeitet die aggregierten Datasets und gibt eine verschlüsselte Machine-Learning-Modell aus.

Schützen Sie mehrere Parteien Machine Learning
Abbildung 3 Secure mehrere Parteien Machine Learning

In diesem Szenario ist vertraulicher Daten in SQL Server-Datenbank mit Always Encrypted mit Secure Enclaves gespeichert und gemeinsam mit einem Machine Learning-Dienst, der in einem TTE ausgeführt wird. Organisationen verwenden Sie das Open Enclave-SDK (openenclave.io) zum Erstellen von portabler C- oder C++-Anwendungen für verschiedene Enclave-Typen. Mit dem SDK nutzen sie auch Enclave Erstellung und Verwaltung von systemprimitiven, Runtime-Unterstützung und kryptografische bibliotheksunterstützung unter Verwendung einer konsistenten API und eine Abstraktion Enclaving. Die Machine learning-Anwendung profitiert von kombiniert mehrere Datenquellen, um eine bessere Trainieren von Modellen zu erstellen. Wie Sie Daten von SQL Server geschützt werden, ist es die Verantwortung für die SQL-Engine die Machine learning-Enclave vor der Freigabe von Daten für sie zu authentifizieren. Nachdem dieser Nachweis erfolgt ist, sind die Daten entschlüsselt und ausschließlich für die Machine learning-Code, ohne es für andere Anwendungen, offenzulegen, selbst wenn auf demselben virtuellen Computer oder app Service oder die hosting-Cloudplattform ausgeführt sichtbar ist.

Enclave-Nachweis

Die sichere Enclave in der SQL Server-Engine kann vertrauliche Daten in verschlüsselten Datenbankspalten und die entsprechenden spaltenverschlüsselungsschlüssel zugreifen. Aber bevor eine Anwendung eine SQL-Abfrage, die Enclave-Berechnungen in SQL Server umfasst senden kann, sollten sie überprüfen, ob die Enclave eine echte Enclave basierend auf einer bestimmten Technologie ist, VBS, z. B. – und innerhalb der Enclave Ausführung des Codes ordnungsgemäß signiert wurde. Der Prozess der Überprüfung der Enclave Enclave-Nachweis aufgerufen wird, und, im Fall von SQL Server, sie der SQL-Clienttreiber, die von der Clientanwendung verwendet werden, um die wenden Sie sich an einen externen Attestation-Dienst umfasst. Die Details von den nachweisprozess hängen davon ab, die Enclave-Technologie und die Attestation-Dienst. Der nachweisprozess, die, den SQL Server für die sichere VBS-Enclaves in SQL Server-2019 unterstützt, heißt Windows Defender System Guard Nachweis zur Laufzeit, die (Host Guardian Service, HGS) als ein Attestation-Dienst verwendet. Sie müssen zum Konfigurieren von Host-Überwachungsdienst in Ihrer Umgebung und registrieren den Computer, die Ihre SQL Server-Instanz im Host-Überwachungsdienst hostet. Sie haben auch so konfigurieren Sie Ihre Clientanwendungen mit einer Host-Überwachungsdienst-Nachweis.

Um Vertrauensstellungen zwischen den Parteien herzustellen, verfügbar machen, VBS Enclaves einen Enclave-Nachweis-Bericht, der vollständig durch einen VBS-eindeutigen Schlüssel signiert ist. Ein nachweisdienst verwendet in diesem Bericht, um eine Vertrauensstellung zwischen einer Clientanwendung und einer enklave herzustellen. Im Wesentlichen umfasst Nachweis den Enclave-Bericht, den Nachweis der Identität und die Integrität der TEE-Anwendung, und für die Machbarkeitsstudie Plattformintegrität (die Messung der Host "und" TEE enthält). Der eindeutige VBS-Schlüssel dient zum Verknüpfen der beiden, da sie sich den Bericht verwendet wird und befindet sich in der Messungen. Host-Überwachungsdienst überprüft die Eigenschaften der Plattform und gibt ein Integritätszertifikat, mit dem Schlüssel darin. Der Client überprüft den gesamten Bericht mit der VBS-Taste, überprüft den VBS-Schlüssel selbst über sein Integritätszertifikat, und schließlich überprüft auch das Integritätszertifikat ausgestellt werden, indem der Host-Überwachungsdienst es vertraut. Eine Enclave Ruft die Schlüssel zum Verschlüsseln und Entschlüsseln von Daten über einen sicheren Tunnel hergestellt, indem der Clienttreiber und der Enclave selbst ab. Ein Sitzungsschlüssel wird für die Kommunikation über diesen Kanal generiert. Der Client-Treiber verschlüsselt den Verschlüsselungsschlüssel für Spalten mit dem Sitzungsschlüssel und signiert anschließend sendet der SQL-Abfragen, die Enclave-Berechnungen erfordern. Abbildung 4erweitert das Kommunikationsprotokoll von SQL Server Always Encrypted mit Secure Enclaves ändern für die Verwendung von Attestation-Dienst.

Enclave-Nachweis für eine SQL Server-Datenbank
Abbildung 4-Enclave-Nachweis für eine SQL Server-Datenbank

Um Always Encrypted mit sicheren Enclaves zu verwenden, muss eine Anwendung einen Client-Treiber verwenden, der die Funktion unterstützt. In SQL Server-2019 sollten Ihre Anwendungen .NET Framework 4.6 oder höher und .NET Framework-Datenanbieter für SQL Server verwenden. Darüber hinaus wird .NET-Anwendungen müssen mit einem sicheren enclaveanbieter für den Enclave-Typ (z. B. VBS) und die Attestation-Dienst (z. B. HGS) konfiguriert werden, Sie verwenden. Die unterstützten Enclave-Anbieter werden separat in einem NuGet-Paket ausgeliefert, die Sie in Ihre Anwendung integrieren müssen. Ein Enclave-Anbieter implementiert die clientbasierte Logik für das nachweisprotokoll und für die Einrichtung eines sicheren Kanals mit eine sichere Enclave eines bestimmten Typs. Always Encrypted derzeit nicht in .NET Core unterstützt.

Sie finden detaillierte Anweisungen zum Konfigurieren von SQL Server Always Encrypted mit sicheren Enclaves mithilfe von SQL Server Management Studio (SSMS) im Lernprogramm unter bit.ly/2Xig9nr. Das Lernprogramm behandelt, durch die Installation eines Host-Überwachungsdienst-Computers zum Ausführen von Host-Überwachungsdienst zur Unterstützung des Host-schlüsselnachweis, und klicken Sie dann die Konfiguration von SQL Server als überwachten Host bei HGS, die mit den schlüsselnachweis Host registriert. Beachten Sie, dass der Zweck des Tutorials ist eine einfache Umgebung nur für Testzwecke zu erstellen. Schlüsselnachweis Host ist zur Verwendung in testumgebungen empfohlen. Sie sollten die Trusted Platform Module (TPM)-Nachweis für produktionsumgebungen verwenden. TPM ist eine Technologie, die Funktionen für hardwarebasierte Sicherheit bieten. Ein TPM-Chip ist ein sicherer Crypto-Prozessor speziell dazu entwickelt, kryptografische Vorgänge direkt in der CPU durchzuführen. Der Chip umfasst mehrere physische Sicherheitsmechanismen, um es für Anwendungen vor Missbrauch zu machen. Wenn Sie mehr über TPM "und" Gewusst wie: Initialisieren von Host-Überwachungsdienst mit TPM-vertrauenswürdiger Nachweis interessieren, können Sie beginnen Sie mit bit.ly/2T3lVuN.

Zum Verbinden mit einer Instanz von SQL Server Always Encrypted sollte die Verbindungszeichenfolge Ihrer Clientanwendung zwei zusätzliche Parameter enthalten:

  • Column Encryption Setting = aktiviert
  • Enclave-Nachweis-URL = Https: / / < Ihr-Host-Überwachungsdienst-Server > / Nachweis

Beispielsweise wäre die Verbindungszeichenfolge für eine .NET-Anwendung ähnlich der folgenden Einstellung:

<connectionStrings>
  <add name="DataConnection" connectionString="Data Source=.;
    Initial Catalog=[Database Name]; Integrated Security=true;
      Column Encryption Setting = Enabled;
        Enclave Attestation URL=https://[Your-HGS-Server]/Attestation" />
</connectionStrings>

Vorhersage in Machine Learning

Der Machine Learning-Anwendung, die ich in diesem Artikel Präsentation bin wird mit ML.NET (dot.net/ml), ein open Source- und plattformübergreifende-Machine learning-Framework für .NET erstellt. Bei der Entwicklung können ML.NET derzeit noch Machine Learning-Tasks wie Klassifizierung und Regression. Das Framework stellt auch APIs für das Trainieren von Modellen als auch Core-Komponenten wie z. B. Transformationen Datenstrukturen und Algorithmen für maschinelles lernen.

Im Fall des Gesundheitswesens verwenden der Machine learning-Anwendung implementiert, die eine Klassifizierung mit mehreren Klassen, die klassifiziert Patienten in gemäß der Wahrscheinlichkeit, dass Aufgabengruppen sie entwickle eine bestimmte Krankheit (weniger morbid halber hier, ich werde, finden Sie unter einem generische Krankheit statt einer speziell zu benennen). Wie in der Beschreibung dieses mehrere Parteien Data Source-Szenario erwartet, Teilen Integrität Institute ihre verschlüsselte Datasets, mit allen erforderlichen Funktionen für das Trainieren eines Modells.

Die Machine learning-Code wird eine Web-API entwickelt, C#. Fügen Sie in Visual Studio-Projektmappe ein Verweis auf das Microsoft.ML NuGet-Paket hinzu. Dieses Paket enthält die ML.NET-Bibliothek und die relevanten Namespaces, um die Anwendung hinzuzufügen:

using Microsoft.ML;
using Microsoft.ML.Core.Data;
using Microsoft.ML.Data;

Die Web-API-Lösung implementiert die POST-Methode, die eine JSON-Nutzlast akzeptiert, die einen medizinischen Datensatz beschreibt. Die MedicalRecord-Klasse in der Projektmappe, siehe Abbildung 5, identifiziert die Funktionen, die für die von der Engine ML.NET analysiert. Risiko ist die Bezeichnung des Datasets. Es handelt es sich um den Wert für den es trainiert wird.

Abbildung 5: die MedicalRecord-Klasse

public class MedicalRecord
{
  public float Risk { get; set; }
  public int Age { get; set; }
  public int Sex { get; set; }                // 0 = Female, 1 = Male
  public bool Smoker { get; set; }
  public ChestPainType ChestPain { get; set; }
  public int BloodPressure { get; set; }      // In mm Hg on admission to
                                              // the hospital
  public int SerumCholestoral { get; set; }   // In mg/dl
  public bool FastingBloodSugar { get; set; } // True if > 120 mg/dl
  public int MaxHeartRate { get; set; }       // Maximum heart rate achieved
}
public enum ChestPainType
{
  TypicalAngina = 1,
  AtypicalAngina,
  NonAnginal,
  Asymptomatic
}

Die Anforderung der JSON-Nachricht wird davon ausgegangen, das folgende Format:

{
  "risk": 0.0,
  "age": 0,
  "sex": 0,
  "smoker": false,
  "chestPain": 0,
  "bloodPressure": 0,
  "serumCholestoral": 0,
  "fastingBloodSugar": false,
  "maxHeartRate": 0
}

Die Klassifizierung-Klasse implementiert die mehrklassige Klassifizierung-Aufgabe, die mit einem medizinischen Datensatz in der Eingabe, eine Klasse Risiko verkleinert die Krankheit, die den Patienten zuweist. Dieser Prozess entwickelt, über die folgenden vier Schritte aus:

  1. Instanziieren Sie ein MLContext-Objekt, das die Datenkontextklasse ML.NET darstellt.
  2. Trainieren des Modells auf Basis der historischen Datasets, die in SQL Server verfügbar (und in einer enklave geschützt).
  3. Bewerten des Modells an.
  4. Bewerten Sie es aus.

Die Ausgabe wird an die Clientanwendung (der Health-Institute) in Form einer JSON-Antwort zurückgegeben:

{
  "score": 0.0,
  "accuracy": 0.0
}

Aber gehen Sie wir in der Reihenfolge aus, und Beschreiben Sie jeden Schritt in der Machine learning-Code. Der erste Schritt ist die Erstellung eine Instanz von MLContext als Teil der Klassifizierung-Klasse, mit einem zufälligen Ausgangswert (Startwert: 0) für wiederholbare und deterministische Ergebnisse aus mehreren Schulungen. MLContext ist das Verweisobjekt, für den Zugriff auf Daten und trainierten Modelle als auch relevante Machine learning-Transformatoren und kalkulatoren:

public Classification()
{
  _context = new MLContext(seed: 0);
}
private MLContext _context;

Der nächste Schritt im Machine learning-Prozesses wird Trainieren des Modells, siehe Abbildung 6. Dies ist der Schritt, der Daten aus der SQL Server-Datenbank in der sicheren Enclave lädt. Eine Verbindung mit SQL Server wird erstellt die SqlConnection-Klasse, die Befehlszeileneingabe den Nachweis und die Kommunikation mit der Enclave über einen sicheren Kanal verwenden.

Abbildung 6: Trainieren des Modells

public IEnumerable<MedicalRecord> ReadData(int split = 100)
{
  IEnumerable<MedicalRecord> medicalRecords = new List<MedicalRecord>();
  using (var connection = new SqlConnection(ConnectionString))
  {
    connection.Open();
    using (SqlCommand cmd = connection.CreateCommand())
    {
      cmd.CommandText = SqlQuery(split);
      using (SqlDataReader reader = cmd.ExecuteReader())
      {
        if (reader.HasRows)
        {
          while (reader.Read())
          {
            medicalRecords.Append(ReadMedicalRecord(reader));
          }
        }
      }
    }
  }
  return medicalRecords;
}

Bitte beachten Sie den Split-Parameter, der verwendet wurde, um einen Prozentsatz von Datensätzen aus der Datenbank, verwenden die Tablesample-Funktionalität in SQL Server auszuwählen. Training und Auswertung eines Modells müssen eine andere Teilmenge der Daten als Eingabe an. Eine gute Annäherung ist das Zuweisen von 80 Prozent der Daten für das Training, abhängig von der Qualität. Je höher die Qualität der Eingabe, desto besser die Genauigkeit der Vorhersage:

private static string SqlQuery(int split) =>
  $"SELECT [Age], [Sex], [Smoker], [ChestPain],
    [BloodPressure], [SerumCholestoral], [FastingBloodSugar],
      [MaxHeartRate] FROM [dbo].[MedicalRecords] tablesample({split} percent)";

Daten werden anschließend in den aktuellen ML-Kontext geladen, und ein trainiertes Modell wird mithilfe einer Methode, die vorhersagt, über eine lineare mehrklassige klassifikationsmodell trainiert mit dem stochastischen Dual koordinieren Versalhöhe (SDCA)-Algorithmus, einen Prozess für das lösen ein Ziel abgerufen. Probleme mit umfangreichen beaufsichtigten lernen. Der Klassifizierung mit mehreren Klassen Trainer ist einer Pipeline mit Schulungsleiter vor dem "Anpassen der tatsächlichen"; hinzugefügt. d.h., bevor das Training des Modells erfolgt. ML.NET transformiert die Daten, die mit der eine Kette von Prozessen, die eine benutzerdefinierte Transformation vor dem trainieren und Testen anwenden.

Der Zweck der Transformation für das in der TrainModel-Methode, siehe abbildung7, besteht darin, Label-Quelldaten, die das Format angibt, die Machine learning-Algorithmus erkennt. Um diese featurebereitstellung von Daten zu erreichen, kombiniert die Transformationspipeline alle featurespalten in der Spalte mit den Features mit der concatenate-Methode. Jedoch müssen Sie zuerst muss ich konvertieren alle Daten nicht "float", um Datentypen "float", wie alle ML.NET lerner Features Vektoren von "float" erwartet.

Abbildung 7, die ein Modell trainieren zu erhalten

public void TrainModel(IDataSource<MedicalRecord> dataSource, Stream targetStream)
{
  IEnumerable<MedicalRecord> sourceData = dataSource.ReadData(80); 
    // 80% of records for training
  IDataView trainData = _context.Data.ReadFromEnumerable<MedicalRecord>(sourceData);
  // Convert each categorical feature into one-hot encoding independently
  var transformers = _context.Transforms.Categorical.OneHotEncoding(
    "MedicalRecordAge", nameof(MedicalRecord.Age))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSex", nameof(MedicalRecord.Sex)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSmoker", nameof(MedicalRecord.Smoker)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordChestPain", nameof(MedicalRecord.ChestPain)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordBloodPressure", nameof(MedicalRecord.BloodPressure)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordSerumCholestoral", nameof(
        MedicalRecord.SerumCholestoral)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordFastingBloodSugar", nameof(
        MedicalRecord.FastingBloodSugar)))
    .Append(_context.Transforms.Categorical.OneHotEncoding(
      "MedicalRecordMaxHeartRate", nameof(MedicalRecord.MaxHeartRate)));
  var processChain = _context.Transforms.Concatenate(DefaultColumnNames.Features,
      nameof(MedicalRecord.Age),
      nameof(MedicalRecord.Sex),
      nameof(MedicalRecord.Smoker),
      nameof(MedicalRecord.ChestPain),
      nameof(MedicalRecord.BloodPressure),
      nameof(MedicalRecord.SerumCholestoral),
      nameof(MedicalRecord.FastingBloodSugar),
      nameof(MedicalRecord.MaxHeartRate)
  ).AppendCacheCheckpoint(_context);
  var trainer =
    _context.MulticlassClassification.Trainers.StochasticDualCoordinateAscent(
      labelColumn: DefaultColumnNames.Label,
        featureColumn: DefaultColumnNames.Features);
  var pipeline = processChain.Append(trainer);
  var model = pipeline.Fit(trainData);
  _context.Model.Save(model, targetStream);
}

Alle Funktionen im medizinischen Datensatz sind im Grunde Kategorien und float-Werte nicht. Daher gelten vor der Verkettung in eine einzelne Ausgabe-Spalte, ich eine kategorische Transformation für jeweils mithilfe der OneHotEncoding-Funktion. Standardmäßig verarbeitet ein lernalgorithmus nur Funktionen aus der Spalte mit den Features. Die AppendCacheCheckpoint-Methode am Ende speichert die Quelldaten, also wenn Sie die Daten, die mehrere Male mit dem Cache durchlaufen haben, können Sie eine bessere Leistung erzielen. Das tatsächliche Training erfolgt beim Aufrufen der Anpassungsmethode für die Pipeline zu. Kalkulatoren Nutzung von Daten und erstellen ein Machine Learning-Modell. Der Anpassungsmethode gibt zurück, ein Modell für Vorhersagen verwendet wird. Trainierte Modelle können schließlich in einen Stream, für die zukünftige Verwendung beibehalten werden.

Nach der das Trainieren des Modells, die Auswertung von Modellen ist ein guten Qualität des nächsten Schritts Modell bewerten, der die Vorhersage des Ergebnisses ist sichergestellt. Bewertung der vorhergesagten Daten erfolgt für einen Datensatz abgerufen, die als Transformation mit Testdaten aus dem trainierten Modell, das mithilfe des Prozentsatzes der Quelldaten (in diesem Fall 20 Prozent), siehe Abbildung 8. Die "Evaluate"-Methode des Objekts definiert, die innerhalb des aktuellen Kontexts für ML.NET MulticlassClassification berechnet die Qualitätsmetriken für das Modell anhand des angegebenen Datasets. Es gibt eine MultiClassClassifierMetrics-Objekt, das die allgemeinen gesamtmetriken berechnet multiklassenklassifizierung Auswerter enthält. In meinem Beispiel berechnen Sie die Genauigkeit als Prozentsatz der richtigen Vorhersagen aus der Gesamtmenge der Datensätze, die ausgewertet. Die TopKAccuracy-Metrik beschreibt die Relative Anzahl der Beispiele, in dem die Bezeichnung "true" eines der wichtigsten K ist, vorhergesagt Bezeichnungen.

Abbildung 8 Auswerten des Modells

public double EvaluateModel(IDataSource<MedicalRecord> dataSource,
  Stream modelStream)
{
  IEnumerable<MedicalRecord> sourceData = dataSource.ReadData(20); 
    // 20% of records for evaluation
  var testData =
    _context.Data.ReadFromEnumerable<MedicalRecord>(sourceData);
  var predictions = _context.Model.Load(modelStream).Transform(testData);
  var metrics = _context.MulticlassClassification.Evaluate(
    data: predictions, label: DefaultColumnNames.Label,
      score: DefaultColumnNames.Score,
        predictedLabel: DefaultColumnNames.PredictedLabel, topK: 0);
  return metrics.TopKAccuracy / metrics.TopK * 100.0 / sourceData.Count();
}

Der letzte Schritt in der Klassifizierung-API ist zum Bewerten des Modells und zum Generieren der Vorhersage, die ein Risiko für eine Person mit dem angegebenen medizinischen Datensatz identifiziert. Bewerten eines Modells beginnt Laden des Datenmodells, die zuvor trainiert und gespeichert, und erstellen dann eine Vorhersage-Engine aus, das Modell trainiert. In der Bewertung-Methode ich laden Sie das trainierte Modell, und klicken Sie dann die CreatePredictionEngine-Funktion aufruft, mit der medizinischen Datensatz und Risiken vorhersagetypen (die MedicalRecord und RiskPrediction C# Klassen). Die Engine für die Vorhersage generiert eine Bewertung, die die Klasse des Risikos eines Patienten mit dem analysierten medizinischen Datensatz identifiziert:

public double Score(MedicalRecord medicalRecord, Stream modelStream)
{
  ITransformer trainedModel = _context.Model.Load(modelStream);
  var predictionEngine = trainedModel.CreatePredictionEngine<MedicalRecord,
    RiskPrediction>(_context);
  var prediction = predictionEngine.Predict(medicalRecord);
  return prediction.Score;
}

Das RiskPrediction-Objekt enthält, die Bewertung und die Genauigkeit Attribute, die von der Post-Methode, die Web-API zurückgegeben. Für die Bewertung-Eigenschaft hinzugefügt habe ich das ColumnName-Attribut, um ML.NET mitzuteilen, dass dies den ausgewerteten Wert erzeugt, die von der Predict-Methode von der Engine für die Vorhersage Ausgabe sollen:

public class RiskPrediction
{    [ColumnName("Score")]
  public double Score;
  public double Accuracy;
}

Siehe schließlich Abbildung 9, die Post-Methode der Web-API des Gesundheitswesens verarbeitet alle diese Schritte nacheinander:

  1. Ruft eine MedicalRecord-Objekt aus seiner Darstellung im JSON-Format ab.
  2. Instanziiert das Hilfsprogramm, Klassifizierung, das ML.NET für mehrklassige Klassifizierung verwendet.
  3. Trainiert ein, und speichert das Modell.
  4. Berechnet die Genauigkeit
  5. Sagt die Risiken im Zusammenhang mit der medizinischen Datensatz in der Eingabe angegeben.

Abbildung 9: das Risiko eines bestimmten Datensatzes medizinischen Vorhersagen

public IHttpActionResult Post(string medicalRecordJson)
{
  MedicalRecord medicalRecordObj =
    JsonConvert.DeserializeObject<MedicalRecord>(medicalRecordJson);
  Classification classification = new Classification();
  FileStream modelStream = new FileStream("[Path]", FileMode.Create);
  classification.TrainModel(new MedicalRecordDataSource(), modelStream);
  double accuracy = classification.EvaluateModel(
    new MedicalRecordDataSource(), modelStream);
  double score = classification.Score(medicalRecordObj, modelStream);
  RiskPrediction prediction = new RiskPrediction
  {
    Score = score,
    Accuracy = accuracy
  };
  return Json<RiskPrediction>(prediction);
}

Erwägen Sie, dass dieser Code einen Rand um die Leistung in trainierte Modelle zur weiteren Verwendung, z. B. Zwischenspeicherung verfügt. Das Trainieren des Modells und Auswertung können übersprungen werden, bei der Arbeit mit vorab trainierte Modelle, stellt eine erhebliche Leistungssteigerung bewirken.

In meinen Tests habe ich versucht, den vorhersageprozess ausgeführt, für die einzelnen Datasets abgerufen, indem die Integrität Institute, erhalten eine durchschnittliche Genauigkeit von 90 Prozent. Jedes Dataset verfügt über ungefähr 100.000 Datensätze. Genauigkeit, wenn mehrere Datasets in einer einzigen Datei kombinieren, 96 Prozent erreicht.

Zusammenfassung

In diesem Artikel habe ich gezeigt, wie ein Machine learning-Anwendung bessere Vorhersagen erstellen kann, durch die Nutzung eines größeren Datasets, durch das Sammeln von Daten aus mehreren vertrauenswürdigen Quellen ohne Beeinträchtigung der Vertraulichkeit der Informationen für alle Parteien freigegeben beteiligt. Dies erfolgt durch den Schutz der Daten durch die Machine learning-Code in eine SQL Server Always Encrypted-Enclave, der die Azure-computing vertrauliche Technologie gehört. Der Machine learning-Lösung erfasst Datasets aus verschiedenen geschützte Quellen und durch Kombinieren von Daten in einem größeren Dataset erhält höhere Genauigkeit der Vorhersage ab, auf das trainierte Modell.

Es ist wichtig zu erwähnen, dass vertrauliche computing Ihres Codes zur Ausführung in einem TEE erfordert. Im Beispiel in diesem Artikel vorgestellten ist der SQL-Clienttreiber die Intermediator mit der vertrauenswürdigen ausführungsumgebung von SQL Server. ML.NET Code aus diesem Grund kann oder möglicherweise nicht innerhalb einer TEE ausgeführt werden. Wenn dies der Fall ist, nennt einen sicheren mehrere Parteien maschinelles lernen Berechnung man dies. Mehrere Parteien Berechnung bedeutet, dass zwei oder mehr Parteien sich gegenseitig ausschließende Vertrauensebene, die Daten und/oder Code zum Schutz vor anderen erdenkliche vorhanden sind. In diesem Fall möchte der Parteien Berechnung zusammen, um eine freigegebene-Ausgabe zu generieren, ohne Verlust von sensiblen Daten ausführen. Die Enclave fungiert als eine vertrauenswürdige Intermediator für diese Berechnung.

Die gesamte Lösung steht auf GitHub unter bit.ly/2Exp78V.


Stefano Tempestaist Microsoft Regional Director, MVP für KI und Business-Anwendungen und Mitglied der Blockchain Rat. Regelmäßiger Referent bei Konferenzen für internationale IT, einschließlich Microsoft Ignite und Tech Summit, erweitern Sie Tempestas Interessen Blockchain und AI-verwandten Technologien. Er erstellt Blogchain-Speicherplatz (blogchain.space), ein Blog zur blockchaintechnologien schreibt für MSDN-Magazin und MS Dynamics-Welt und Machine Learning-Experimente in Azure AI-Katalog veröffentlicht (Gallery.Azure.AI).

Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Gleb Krivosheev, Simon Leet
Simon Leet ist das Principal Engineer, der in der Azure vertrauliche Computing-Produktgruppe.