[PYTHON] Suche nach Eigenschaften, um mit TensorFlow-Part 1 zu beginnen

TensorFlow wurde im November 2015 von Google veröffentlicht. Das Thema des offiziellen Tutorials ist die handschriftliche Nummernerkennung von MNIST. https://www.tensorflow.org/get_started/mnist/beginners

Ich wollte jedoch etwas tun, das für mein Leben nützlicher ist, und entschied mich daher für das Thema "Immobilien finden".

Beachten

MNIST handschriftliche Nummernerkennung

MNIST Handwritten Number Recognition ist ein bekanntes Problem in der künstlichen Intelligenz, insbesondere im Bereich der Bilderkennung. Es ist eine Aufgabe, handschriftliche Zeichen von 0 bis 9 einzugeben und zu bestimmen, um welche Zahl es sich bei 0 bis 9 handelt. Je höher der Prozentsatz der Testdaten ist, die richtig beurteilt werden können, desto besser (einfach gesagt).

Die Anzahl der Daten und die Dimensionen der Eingabedaten und Ausgabedaten sind wie folgt.

num_of_data=70,000(60,000 training data, 10,000 test data)
input=784 (28*28 Pixel)
output=10 (Beschriftungen von 0 bis 9)

Bild- und Etikettentraining, Validierung, Testdatenabmessungen

---- _images ----
(55000, 784)
(5000, 784)
(10000, 784)
<type 'numpy.ndarray'>
---- _labels ----
(55000, 10)
(5000, 10)
(10000, 10)
(agile_env)tensorflow $ pwd

Eigenschaftssuche: Problemstellung

Lassen Sie uns überlegen, welche Art von Problem in Bezug auf "Immobiliensuche" in Bezug auf "MNIST-Erkennung handgeschriebener Nummern" zu lösen ist. Diesmal übernehmen wir insbesondere Mietobjekte.

Bei der Suche nach einem Mietobjekt ist es üblich, das Objekt anhand von Bedingungen wie dem Gebiet, in dem Sie leben möchten, einzugrenzen. Ich denke, das ist ein Gesichtspunkt, der irgendwann definitiv Anlass zur Sorge geben wird.

Wenn Sie andere Immobiliendaten verwenden können, um so etwas wie eine "angemessene Mietrichtlinie" abzuleiten, können Sie möglicherweise herausfinden, ob die Miete der Immobilie, an der Sie interessiert sind, billig oder teuer ist ...? Ich dachte.

Immobilien mit unterschiedlichen Merkmalen scheinen eine Welt zu sein, in der es schwierig ist, Preisvorhersagen zu treffen, aber zumindest für mich war es ein interessanteres Problem als das Erkennen handgeschriebener Zahlen, also werde ich es versuchen.

◯◯ Ich möchte in einem 10 Jahre alten Gebäude mit 1LDK wohnen, 10 Minuten zu Fuß vom Bahnhof entfernt.
・ Mir wurde gesagt, dass es 10.000 Yen pro Monat sind, aber ist es ein Schnäppchen?
・ Als Richtwert scheint es XX 10.000 Yen zu sein. ◯◯ Sind 10.000 Yen nicht zu teuer?

Betrachten wir die Eingabedaten und Ausgabedaten auf die gleiche Weise wie die MNIST-Daten. Ich bezog mich auf Bewertung des Gehalts von professionellen Baseballspielern mit neuronalen Netzen.

input=34(29+1+3+1)Siehe unten
output=10

*Art der Eingabe
・ Nächste Station: 29 Stationen der Yamate-Linie (eine)-hot vector) *Verringern Sie, wenn zu viel, erhöhen Sie, wenn zu wenig (andere Routen?).
Von der Shinagawa Station aus herumlaufen. Shinagawa Station:0. Element der Eingabe,Osaki Station:1,...
・ Gehen Sie zur nächsten Station ◯ Minuten (0 basierend auf dem Maximalwert in den Daten-Normalisiert auf 1)
・ Layout: 3 Arten von 1LDK, 2DK, 2LDK(one-hot vector) *Das Layout, in dem der Autor wahrscheinlich lebt
·Alter(Maximal 0 in den Daten-Normalisiert auf 1)
##・ Mit oder ohne Anzahlung
##・ Anwesenheit oder Abwesenheit von Belohnung
##·Bereich(Normalisiert mit dem Maximalwert in den Daten)
##・ Wohnung, Wohnung: (one-hot vector)
…

*Ausgabetyp
0: 7.Weniger als 50.000 Yen
1: 7.5-8.Weniger als 0,000 Yen
2: 8.0-8.Weniger als 50.000 Yen
3: 8.5-9.Weniger als 0,000 Yen
4: 9.0-9.Weniger als 50.000 Yen
5: 9.5-10.Weniger als 0,000 Yen
6: 10.0-10.Weniger als 50.000 Yen
7: 10.5-11.Weniger als 0,000 Yen
8: 11.0-11.Weniger als 50.000 Yen
9: 11.50.000 Yen oder mehr

Datensammlung

Dieses Mal werde ich die Suchergebnisse einer umfassenden Informationsseite über bestimmte wichtige Immobilien und Wohnungen verwenden. Geben Sie beispielsweise eine Bedingung an, z. B. "JR Yamate Line, 1LDK / 2DK / 2LDK, 100 Elemente pro Seite angezeigt".

Kriechen Sie mit Python usw. und sammeln Sie zum Beispiel auf diese Weise.

train_JR Yamate Line/Tabata Station 14 2DK 15 11.8000001907 [Eigenschafts-URL]
train_JR Yamate Line/Tabata Station 14 2DK 15 11.8000001907 [Eigenschafts-URL]
train_JR Yamate Line/Tabata Station 14 2DK 15 11.8000001907 [Eigenschafts-URL]
train_JR Yamate Line/Tabata Station 14 2DK 15 11.8000001907 [Eigenschafts-URL]
…

Insgesamt 29786 Fälle (zum Zeitpunkt der Ausführung).

Daten formatieren / lesen

Ändern Sie die im TensorFlow-Lernprogramm bereitgestellte Datei input_data.py in Ermöglicht das Lesen der als CSV vorbereiteten Eingabedaten.

Bestimmen Sie das Verhältnis von Trainings-, Validierungs- und Testdaten (22000, 2000, 5786).

split -l 24000 attributes.csv
(after splitting, rename to train- and test- attributes.csv)
split -l 24000 labels.csv
(after splitting, rename to train- and test- labels.csv)

REAL_ESTATE_data $ tail -5 train-attributes.csv 
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.06451612903225806,1,0,0,0.36666666666666664
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01935483870967742,0,1,0,0.6333333333333333
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0.0967741935483871,0,0,1,0.1111111111111111
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1032258064516129,1,0,0,0.32222222222222224
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.05161290322580645,1,0,0,0.1
REAL_ESTATE_data $ tail -5 train-labels.csv 
8
9
9
6
9
REAL_ESTATE_data $ tail -5 test-attributes.csv 
0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0967741935483871,0,0,1,0.25555555555555554
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.05806451612903226,0,1,0,0.34444444444444444
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.12258064516129032,0,1,0,0.35555555555555557
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.03870967741935484,0,1,0,0.5
0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.16129032258064516,1,0,0,0.022222222222222223
REAL_ESTATE_data $ tail -5 test-labels.csv 
9
9
9
9
9
REAL_ESTATE_data $ 

extract_images (Dateiname) liest csv nur so wie es ist (obwohl es nicht mehr "Bilder" ist).

def extract_images(filename):
  print('Extracting images ', filename)
  data = numpy.genfromtxt(filename, delimiter=',') # default is dtype=float
  return data

Die DataSet-Klasse wird ebenfalls weggelassen, da keine Dimensionskonvertierung erforderlich ist.

class DataSet(object):
  
  def __init__(self, images, labels, fake_data=False):
    if fake_data:
      self._num_examples = 10000
    else:
      assert images.shape[0] == labels.shape[0], ( "images.shape: %s labels.shape: %s" % (images.shape, labels.shape))
      self._num_examples = images.shape[0]

    self._images = images
    self._labels = labels
    self._epochs_completed = 0
    self._index_in_epoch = 0
…

Modell-

Folgen Sie dem TensorFlow-Tutorial (für Anfänger), um ein Softmax-Regressionsmodell zu erstellen. Das Softmax-Regressionsmodell scheint im Allgemeinen ein beliebtes Modell zu sein, wenn Sie eine Wahrscheinlichkeit zuweisen möchten, dass etwas einer von mehreren verschiedenen Kandidaten sein wird. Im Beispiel der handschriftlichen Zahlenerkennung ist es ein Bild, das die Wahrscheinlichkeit von "9" bis 80%, die Wahrscheinlichkeit von "8" bis 4% usw. für ein bestimmtes Bild zuweist.

[0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.04, 0.80]
softmax: exponentiating its inputs and then normalizing them. 

exponentiation:
- one more unit of evidence increases the weight given to any hypothesis multiplicatively. 
- one less unit of evidence means that a hypothesis gets a fraction of its earlier weight. 
- No hypothesis ever has zero or negative weight. 

normalization:
- they add up to one, forming a valid probability distribution.

Erstes Ergebnis

(agile_env)tensorflow $ python intro_mnist_refactor.py
##### prepare and read data set #####
Extracting images  REAL_ESTATE_data/train-attributes.csv
Extracting labels  REAL_ESTATE_data/train-labels.csv
Extracting images  REAL_ESTATE_data/test-attributes.csv
Extracting labels  REAL_ESTATE_data/test-labels.csv
##### init and run session #####
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4
can't determine number of CPU cores: assuming 4
I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4
##### training #####
##### evaluation #####
0.859834
(agile_env)tensorflow $ 

Da die Testdaten 5786 waren, scheinen weniger als 5.000 von ihnen in der Lage zu sein, die Miete korrekt zu bestimmen. Wenn Sie sich nur diese Zahl ansehen, haben Sie ein anständiges Urteil gefällt ...?

Daten betrachten

Möglicherweise haben Sie es bereits in der Phase der Mietkennzeichnung bemerkt. 9 (= Miete ist 115.000 Yen oder mehr dieses Mal) ist überwältigend groß ...! Wenn Sie nach dem Lesen des Datensatzes auf diese Weise aggregieren ...

print mnist.train._labels.shape
print mnist.validation._labels.shape
print mnist.test._labels.shape

print numpy.sum(mnist.train._labels, axis = 0)
print numpy.sum(mnist.validation._labels, axis = 0)
print numpy.sum(mnist.test._labels, axis = 0)
(22000, 10): training
(2000, 10): validation
(5786, 10): test
[   127.    158.    199.    235.    314.    407.    442.    539.    598.  18981.]
[    7.    10.    25.    19.    33.    33.    38.    49.    47.  1739.]
[   48.    41.    51.    71.    84.   123.   113.   133.   141.  4981.]

Es gibt viel mehr Daten mit der Bezeichnung 9 als andere. Die Standardabweichung ist

numpy.std(numpy.sum(mnist.train._labels, axis = 0))
numpy.std(numpy.sum(mnist.validation._labels, axis = 0))
numpy.std(numpy.sum(mnist.test._labels, axis = 0))
5595.73064041
513.175213743
1467.88052647

Was ist mit MNIST-Daten?

(55000, 10): training
(5000, 10): validation
(10000, 10): test
[ 5444.  6179.  5470.  5638.  5307.  4987.  5417.  5715.  5389.  5454.]
[ 479.  563.  488.  493.  535.  434.  501.  550.  462.  495.]
[  980.  1135.  1032.  1010.   982.   892.   958.  1028.   974.  1009.]

Man kann sagen, dass die Daten von 0 bis 9 ausgewogen mit handgeschriebenen Zeichen erfasst werden. Die Standardabweichung ist

291.905806725
37.6218021897
59.1962836671

nächstes Mal

Ich habe vor, die Analyse erneut zu versuchen, während ich Daten von 0 bis 9 in ausgewogener Weise sammle und den Inhalt der Daten betrachte.

Recommended Posts

Suche nach Eigenschaften, um mit TensorFlow-Part 1 zu beginnen
Für diejenigen, die mit TensorFlow2 maschinelles Lernen beginnen möchten
Memo, um nach KPI mit Python zu fragen
Starten Sie das neueste Odo mit 2 Befehlen mit Docker Desktop für Windows
Treten Sie Azure mit Go ~ bei Für diejenigen, die Azure mit Go ~ starten und kennenlernen möchten
Auf der Suche nach einer effizienten Möglichkeit, eine Docker-Datei mit Python mit Gedichten zu schreiben
Ich möchte mit Djangos Migrate von vorne beginnen
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Einfaches IoT, um mit Raspeye und MESH zu beginnen
Stoppen Sie EC2 für eine bestimmte Zeit + beginnen Sie mit Lambda (Python)
Vom Benutzer zum Root ~ Auf der Suche nach Werbung ~ (TAMUctf 2020: Writeup)
Vorbereitung zum Starten von "Python Machine Learning Programming" (für macOS)
Für diejenigen, die Python mit vim schreiben möchten
Dinge zu tun, wenn Sie anfangen, sich mit Django zu entwickeln
Dinge, die Sie bei der Migration mit Django beachten sollten
Konvertieren Sie 202003 bis 2020-03 mit Pandas
Starten Sie IPython mit virtualenv
Django ab heute
Aktualisieren Sie Raspberry Pi Python mit pyenv auf 3.7 oder höher
Versuchen Sie, verschiedene Informationen anzuzeigen, die für das Debuggen mit Python nützlich sind
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
Vom Umgebungsaufbau bis zum Einsatz für Kolben + Heroku mit Docker
Einführung in Python für VBA-Benutzer - Aufrufen von Python aus Excel mit xlwings-
Versuchen Sie, Start / Stop für EC2-Instanzen mit AWS Lambda zu automatisieren
Für Anfänger, wie man mit häufigen Fehlern in Keras umgeht
So starten Sie Apache durch Angabe von httpd.conf mit systemd (CentOS7, CentOS8)